Stavo pensando a quanto codice si dovrebbe inserire nei costruttori in Java? Voglio dire, molto spesso si fanno metodi di aiuto, che si invocano in un costruttore, ma a volte ci sono alcune cose di inizializzazione più lunghe, ad esempio per un programma, che legge da un file, o interfacce utente, o altri programmi, in cui non si 'Inizializza solo le variabili di istanza, in cui il costruttore può allungarsi (se non si utilizzano metodi di supporto). Ho in mente qualcosa che i costruttori dovrebbero generalmente essere brevi e concisi, non dovrebbero? Ci sono eccezioni a questo?Quanto codice si deve inserire in un costruttore?
risposta
Se si seguono i principi SOLID, ogni classe dovrebbe avere una ragione per cambiare (ad esempio, fare una cosa). Di conseguenza, un costruttore normalmente non sta leggendo un file, ma avresti una classe separata che crea gli oggetti dal file.
grazie, mi hai solo aiutato a evitare di rompere l'SRP! –
Appena necessario per completare l'inizializzazione dell'oggetto.
Se si può parlare di una porzione (circa 5 linee è la mia linea guida) del costruttore come una porzione di logica o di un processo specifico, è probabilmente meglio dividerlo in un metodo separato per chiarezza e scopi organizzativi.
Ma a ciascuno il suo.
Costruttori dovrebbe essere abbastanza a lungo, ma non è più =)
Se si definisce più sovraccaricato costruttori, non duplicare il codice; invece, consolidare le funzionalità in una di esse per maggiore chiarezza e facilità di manutenzione.
Ehi, è una buona pratica aggiungere accessor nei costruttori? –
Come ha detto Knuth, "l'ottimizzazione prematura è la radice di tutti i mali".
Quanto dovresti mettere in cassa? Tutto il necessario. Questo è l'approccio "desideroso". Quando - e solo quando - le prestazioni diventano un problema, consideri di ottimizzarlo (con approcci "pigri" o "eccessivi").
Le prestazioni non sono di solito il problema; la manutenzione è! Non sono sicuro di evitare un'ottimizzazione prematura significa evitare un'ottimizzazione prematura della manutenzione ... – skiphoppy
Sì, non penso che questo problema riguardi le prestazioni ... si tratta piuttosto di progettare un codice corretto che sia manutenibile e facile da comprendere per gli altri. –
Sì e il modo migliore per scrivere codice gestibile è scriverlo in modo semplice (cioè desideroso). Il caching per le prestazioni tende a complicare la codifica della realtà, il che è controproducente se le prestazioni non sono un problema. – cletus
Dai uno sguardo allo this SO question. Anche se l'altro è per C++, i concetti sono ancora molto simili.
I costruttori devono creare l'istanza generica minima del proprio oggetto. Quanto generico? Scegli i casi di test che ogni istanza o oggetto che eredita dalla classe deve passare per essere valido - anche se "valido" significa solo fallire con garbo (eccezione generata dal programma).
Wikipedia ha una buona descrizione:
http://en.wikipedia.org/wiki/Constructor_(computer_science)
un oggetto valido è l'obiettivo del costruttore, non è valida necessariamente utile - che può essere fatto in un metodo di inizializzazione.
La mia prassi corrente è che se tutto ciò che il costruttore deve fare è impostare alcuni campi su un oggetto, può essere arbitrariamente lungo. Se diventa troppo lungo, significa che il design della classe è rotto in ogni caso, o che i dati devono essere impacchettati in strutture più complesse.
Se, d'altra parte, i dati di input richiedono una elaborazione più complessa prima di inizializzare i campi di classe, tendo a fornire al costruttore i dati elaborati e spostare l'elaborazione su un metodo di produzione statico.
È possibile che la classe debba essere inizializzata in un determinato stato, prima che qualsiasi lavoro utile possa essere eseguito con esso.
Considerate questo.
public class CustomerRecord
{
private Date dateOfBirth;
public CustomerRecord()
{
dateOfBirth = new Date();
}
public int getYearOfBirth()
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(dateOfBirth);
return calendar.get(Calendar.YEAR);
}
}
Ora, se non si inizializza il varialble membro dateOfBirth, ogni successiva invocazione di getYearOfBirth(), si tradurrà in un NullPointerException.
Quindi l'inizializzazione minimo che può comportare
- Assegnazione di valori.
- Richiamo delle funzioni di supporto.
per garantire che la classe si comporti correttamente quando i membri vengono invocati in seguito, è tutto ciò che deve essere fatto.
Constructor è come un Setup Wizard Application dove si fa solo configurazione. Se l'istanza è pronta a prendere qualsiasi (possibile) Azione su se stessa, quindi il Costruttore sta facendo bene.
- 1. MVC: quanto codice deve essere in una vista?
- 2. Questo codice deve essere in un documento.ready?
- 3. Un costruttore eliminato deve essere privato?
- 4. Come si avvolge un costruttore?
- 5. "chiamata al costruttore deve essere la prima istruzione in un costruttore" questione in Java
- 6. Quanto posso essere libero nel codice in un oggetto invariante?
- 7. Quanto deve durare la durata di un token CSRF?
- 8. Quanto è pericoloso questo codice?
- 9. oggetto implicito del super costruttore() non definito. deve invocare esplicitamente un altro costruttore
- 10. Groovy che aggiunge codice a un costruttore
- 11. Come si utilizza un costruttore personalizzato in un WinForm?
- 12. "Almeno un oggetto deve implementare IComparable" per un INT? Per quanto ne so, lo fa
- 13. Costruttore Codice dipendenza frammento in Visual Studio
- 14. Come si deve accedere alle risorse in un vaso compilato?
- 15. Inserire codice javascript in html con Express
- 16. Inserire il codice PHP in una stringa
- 17. Come posso inserire il codice JavaScript in un documento PDF?
- 18. Inizializzazione array statico C: quanto deve essere prolisso?
- 19. Un costruttore di spostamenti deve prendere un riferimento const o non const?
- 20. Errore servizio controllo crociera: Impossibile costruire net.sourceforge.cruisecontrol.BuildLoopInformation in quanto non ha un costruttore no-args
- 21. Quanto male è jQuery * dentro * Codice MooTools?
- 22. Quanto estensibile dovrebbe essere il codice?
- 23. Modi per inserire una password nel codice
- 24. Quanto spesso si può aggiornare un TextView senza disordine
- 25. Java inizializzare un calendario in un costruttore
- 26. Come inserire il codice in più righe in un codice di più righe?
- 27. Come deve comportarsi un costruttore quando viene fornito un parametro non valido?
- 28. Dove inserire codice comune per iPhone, CLLocationManager
- 29. Costruttori delegati: un inizializzatore per un costruttore delegante deve apparire da solo
- 30. Come si richiama un costruttore statico con riflessione?
prova questo articolo, dovrebbe rispondere alla tua domanda: http://www.yegor256.com/2015/05/07/ctors-must-be-code-free.html – yegor256