2 Stimmen

Java - wo initialisiert man Felder (Instanzvariablen)?

Möglicher Duplikat:
Sollte ich die Variable innerhalb oder außerhalb des Konstruktors initialisieren?

Ich habe hier zwei Beispiele, wie ein Feld (Instanzvariable) in einer Klasse initialisiert wird. Meine Frage ist: Was ist der Unterschied zwischen ihnen? Welches ist das beste und warum?

BEISPIEL 1:

public class Beispiel1 {
        private Object feld;
        public Beispiel1() {
            feld = new Object();
        }
    }

BEISPIEL 2:

public class Beispiel2 {
        private Object feld = new Object();
        public Beispiel2() {
        }
    }

4voto

Craig Otis Punkte 29748

Ihr erstes Beispiel initialisiert die Instanzvariablen im Konstruktor.

Das zweite Beispiel initialisiert sie, wenn die Klasse selbst instanziiert wird, vor der Ausführung des Codes in Ihrem Konstruktor, nach der Ausführung eines Codes im Superklassen-Konstruktor. (Wenn aufgerufen.)

Wenn Sie Instanzvariablen haben, die unabhängig davon, welcher Konstruktor aufgerufen wird, immer auf die gleiche Weise initialisiert werden sollen, sollten Sie die zweite Methode verwenden. Wenn die Initialisierung Ihrer Instanzvariablen davon abhängt, welcher Konstruktor aufgerufen wird, ist die erste Methode besser. Zum Beispiel:

public class Dog {
    private int numLegs = 4;
    private String name = "Fred";

    public Dog() {
    } 

    public Dog(String name) {
        this.name = name;
    }
}

Beachten Sie in obigem Beispiel, dass Sie tatsächlich beide verwenden können - Initialisierung im Konstruktor und während der Instanziierung Ihres Objekts.

Dog myDog = new Dog(); // Der Name dieses Hundes ist Fred
Dog myDog = new Dog("Spot"); // Der Name dieses Hundes ist Spot

2voto

Kerrek SB Punkte 445528

Wenn Sie mehrere Konstruktoren haben, dann können Sie diese Regel ausprobieren:

Wenn das Element auf denselben Wert initialisiert wird, initialisieren Sie es inline. Andernfalls initialisieren Sie es (weisen Sie es wirklich zu) im Konstruktor.

0voto

Azodious Punkte 13643

In Beispiel 1:

Feld wird auf null initialisiert, Konstruktor wird aufgerufen, Feld wird einem Objektreferenz zugewiesen. Konstruktor wird abgeschlossen.

In Beispiel 2:

Feld wird auf eine Objektreferenz initialisiert. Konstruktor wird aufgerufen, Konstruktor wird abgeschlossen.

Nach meiner Meinung sollte Beispiel 2 vermieden werden, es sei denn, es handelt sich um eine statische Referenz.

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