Weg 2 ist besser, weil es Ihnen eine einheitliche Möglichkeit gibt, einen Variablenwert festzulegen. Es birgt jedoch ein Risiko, da Sie eine ausschaltbare Methode in einem Konstruktor aufrufen. So ist die richtige Syntax mit dem Schlüsselwort final:
public final void setField(int field){
this.field = field;
}
//way 2
public A(int field){
setField(field);
}
Mit final
die Methode nicht außer Kraft gesetzt werden. Wenn Sie sich keine finale Methode leisten können, rufen Sie den Setter nicht in einem Konstruktor auf. Aber es ist normalerweise seltsam, einen Setter zu überschreiben.
Das ist gut, weil Sie später die Setter ändern möchten:
- Add Argument überprüft und eine
IllegalArgumentException
werfen, wenn erforderlich.
- hinzufügen Zähler
- Beobachter Notify (in einer beobachtbaren Muster)
- es einen synchronisierten Block Make
Thread-Sicherheit zur Verfügung zu stellen
- ...
Und Sie werden es tun müssen, um in ein einzelner Ort. Dies ist eine Implementierung von 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
Sie sich nicht um die Optimierung und Kosten der zusätzlichen Methodenaufruf kümmern. JVM kann diesen Code normalerweise durch Inlining-Methoden optimieren.
Was wirklich die Entwicklung verlangsamt, ist die Suche nach einem Fehler. Diese Methode hilft Ihnen, weniger Fehler zu machen und Ihren Code leichter zu pflegen.
Aber ist nicht Aufruf eine Methode macht es langsamer? – Aero
Verstanden. Vielen Dank. – Aero
Möglicherweise besteht ein Sicherheitsrisiko beim Aufruf einer öffentlichen überschreibbaren Methode in Ihrem Konstruktor – dkatzel