Way 2 è migliore perché offre un modo unificato per impostare un valore variabile. Ma comporta un rischio, perché stai chiamando un metodo sovrascrivibile in un costruttore. Così la sintassi destra sta usando la parola finale:
public final void setField(int field){
this.field = field;
}
//way 2
public A(int field){
setField(field);
}
Con final
non sarà sovrascritto il metodo. Se non puoi permetterti di avere un metodo finale, non chiamare il setter in un costruttore. Ma di solito è strano scavalcare un setter.
Questo è un bene perché si può decidere di cambiare il setter in seguito:
- controlli Add argomento e gettare un
IllegalArgumentException
quando richiesto.
- Aggiungere un contatore
- Segnalatemi osservatori (in un modello osservabile)
- Ne fanno un blocco sincronizzato per fornire thread-sicurezza
- ...
E si dovrà farlo in un posto unico Si tratta di un'implementazione di DRY principle.
public final synchronized void setField(int field){
if (0 <= field && field <= MAX_VALUE) {
this.field = field;
} else {
throw new IllegalArgumentException();
}
}
//still has all the benefits of setter
public A(int field){
setField(field);
}
A = new A(-1) //throws IllegalArgumentException
Non preoccuparti per l'ottimizzazione e le spese di chiamata di metodo supplementare. In genere, JVM può ottimizzare tale codice integrando i metodi.
Ciò che rende lo sviluppo più lento è la ricerca di un bug. Questo metodo ti aiuta a fare meno errori e a mantenere più facilmente il tuo codice.
fonte
2015-06-13 00:36:48
Ma l'invocazione non è un metodo che lo rende più lento? – Aero
Capito. Grazie. – Aero
Potrebbe esserci un rischio per la sicurezza di chiamare un metodo di sovrascrittura pubblico all'interno del costruttore – dkatzel