3 Stimmen

Ist es OK, bei der Initialisierung eines Feldes auf "this" zu verweisen?

Ist es in Ordnung, auf this beim Initialisieren eines Feldes?

public class MainClass {

  private SomeFieldClass field = new SomeFieldClass(this);

  public MainClass() {}

}

Oder ist es besser, dies im Konstruktor zu tun?

public class MainClass {

  private SomeFieldClass field;

  public MainClass() {
    this.field = new SomeFieldClass(this);
  }

}

Was ist die beste Praxis? Ich glaube, die erste Option ist besser für Unit-Tests und Dependency Injection. Gibt es irgendwelche Probleme mit ihr?

4voto

Binil Thomas Punkte 13559

Ermöglichung der this Referenz-Escape (beide Stile in der Frage), bevor der Konstruktor die Ausführung beendet, ist schlecht (1) in Multithread-Anwendungen und (2) wenn die MainClass wird erweitert.

4voto

Uri Punkte 86472

Die Frage ist ein wenig unklar. Sind Sie besorgt über die Übergabe an Ihren Konstruktor, oder über die Verwendung von this.field im Konstruktorkörper, oder über die Initialisierung eines Feldes im Konstruktor und nicht im Klassenkörper?

Ich persönlich bevorzuge die Verwendung des Präfixes this, wenn ich mich auf Klassenmitglieder beziehe, aber das ist eine Frage des Stils.

Ich ziehe es auch vor, keine Initialisierungen von Nicht-Konstanten im Klassenkörper vorzunehmen. Ich finde, dass es bei längeren Klassen besser ist, alle Initialisierungen an einer Stelle zu haben (z. B. im Konstruktor), als die Deklarationen visuell durchsuchen zu müssen, um die Anfangswerte zu identifizieren.

Wenn Sie nach einer frühen Übergabe fragen (ein Problem in beiden Beispielen), hängt es meiner Meinung nach davon ab, ob Sie mit der Möglichkeit umgehen können, dass das Ziel etwas mit einem teilweise initialisierten Objekt macht. Ich ziehe es vor, solche Erstellungen in eine andere und explizit aufgerufene Funktion zu verlagern (z.B. eine createAssociatedSomeObject())

2voto

Preet Sangha Punkte 62622

Beides ist akzeptabel. Allerdings würden Sie die zweite verwenden, wenn Sie die neue könnte eine Ausnahme, die Sie behandeln können werfen. Ich empfehle die zweite, da diese die Initialisierung an einer Stelle lokalisiert und auch von anderen Konstruktoren aufgerufen werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X