Instanziieren Objekt im Konstruktor
Scheint es, dass das Ergebnis der folgende code ist der gleiche, also Wann sollte ich jeden?
public class Person {
public Person() {
this.family = new Family();
}
Family family;
}
zu
public class Person {
Family family = new Family();
}
(ein Szenario, das ich an denken kann, ist, wenn man mehrere Konstruktoren, und wir möchten, erstellen Sie eine Instanz der Familie nur in einer von Ihnen... ist das der einzige Fall?)
mögliche Duplikate von: stackoverflow.com/questions/3918578/...
InformationsquelleAutor Ohad | 2012-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Klasse Variablen [variable] können Sie nicht die ersten, denn Sie wollen die initializtion passieren nur einmal und nicht jedes mal, wenn Sie rufen Ihren Konstruktor.
Für Instanz-Variablen, die zweite ist nur ein syntatic Zucker von der ersten.
Manchmal werden Sie vielleicht müssen verwenden Sie die zweite - für-argument-Konstruktor, die sich - übergeben an den Konstruktor.
InformationsquelleAutor amit
Letztere garantieren, dass jeder Person wird immer eine Familie haben (Hach, ist das nicht nett). Aber in den früheren, anderen Konstruktoren Hinzugefügt werden könnten, von einem anderen Entwickler, die Familie nicht initialisiert. Das ist eher vorschlagen, die letzteren, kürzere version ist vorzuziehen. Aber das ist nicht wirklich wahr, denn es könnte sein, einen gültigen Zustand zu modellieren einer Person, die nicht eine Familie zu haben, in welchem Fall die Initialisierung per Konstruktor überlegen ist, weil Sie können, übergeben Sie null.
Die 3. alternative ist die (längere, Seufzer) basic POJO-Stil mit den zur Verfügung setter, in der Familie ist nicht initialisiert, bis ein setter ist explizit genannt. Die schönere Sache über mit das ist, dass Sie nicht haben, um einen null-Wert, um einen Konstruktor, wenn Sie modellieren ein Waisenkind.
Es hängt alles davon ab, wie Sie wollen, zu beschränken, die Konstruktion der Person.
InformationsquelleAutor Kevin Welker
Die erste Methode gibt Ihnen individuelle Kontrolle über wie Sie initialisiert das Objekt der Klasse,, die Sie beschäftigen sich mit pro-Konstruktor, während die zweite option initialisieren Sie die Familie Objekt der gleichen Weise für alle Konstruktoren.
Die erste Methode ist vorzuziehen, weil es Ihnen erlaubt, nehmen Sie eine Familie Objekt an den Konstruktor so dass Sie Dinge tun, wie dependency injection, die in der Regel guter Programmierstil (und erleichtert das testen).
Abgesehen davon, dass beide von Ihnen sind member-Variablen (nicht static, wie jemand anderes sagte, müssen Sie mit dem Schlüsselwort static). Jede Instanz dieser Klasse enthält eine Instanz der Familie-Objekt auf diese Weise.
Ich würde empfehlen, so etwas wie dieses
Bearbeiten:
Adresse der Kommentar, der gemacht wurde zu meinem post (was genau war, etwas), es ist ein Unterschied, in dem die Reihenfolge der Objekte werden initialisiert. Aber der Kommentar erklärt, dass die Reihenfolge der Bedienung ist:
Initialisierung von Instanzen, Variablen -> Instanz-Initialisierer -> Konstruktor
Vom testen dieses heraus, es scheint, dass es hängt davon ab, welche auftreten, zuerst in den code der Initialisierung von Instanz-Variablen und Instanz-Initialisierungen, und dann der Konstruktor aufgerufen wird, nachdem beide von Ihnen. Betrachten Sie das Beispiel, in dem der Konstruktor der Familie Objekt nur druckt den string gegeben:
Ergebnisse in dieser Ausgabe beim erstellen eines person-Objekts:
Familie: b
Familie: ein
Familie: c
aber dieser code:
Ergebnisse in dieser Ausgabe beim erstellen eines person-Objekts:
Familie: ein
Familie: b
Familie: c
Danke @BrentWorden, obwohl die Reihenfolge ist nicht immer in der Weise, die Sie angegeben, ich habe sicher zu aktualisieren meinem Beitrag, basierend auf Ihren Vorschlag.
Ja, die Reihenfolge immer so, wie ich angegeben, weil es diktiert von der Java Language Specification:
Nein... es ist nicht. Betrachten Sie das Beispiel oben, dies ist der code, dass ich lief. Die Ausgabe zeigt deutlich, dass die Reihenfolge der Instanz-Initialisierungen und Instanz-Variablen-Initialisierungen sind abhängig, wenn Sie aufgetreten sind in der Datei. Die JSL sagt, dass die Objekte werden initialisiert, wenn das Objekt erstellt wird, und von dem, was ich finden konnte, es wurde nicht angegeben, eine Bestellung. Bitte den link doc, wenn Sie es finden können.
Korrigieren Sie sind. Ich war sicher vorschnell in meiner Verallgemeinerung. Instanz initialisiert und Instanz-Variablen initialisiert werden, in der Reihenfolge wie in der Quelldatei. Konstruktor Gremien aufgerufen werden danach. java.sun.com/docs/books/jls/third_edition/html/...
InformationsquelleAutor dsingleton
Ich würde empfehlen, mit der ersten, wenn es um das erstellen von Unterklassen. Bedenken Sie:
Mit der zweiten Art der Initialisierung werden Sie immer initialisiert eine neue Familie, und dann zu überschreiben, wenn nötig. Das könnte nicht sein, was Sie wollen - und können schlecht für die performance, wenn diese Objekte machen eine Menge Arbeit, wenn Sie instanziiert wird.
InformationsquelleAutor Daff
Der zweite Stil ist schrecklich, wenn Sie planen, die Klasse zu erweitern (siehe Daff ' s Antwort).
Für Instanz-Variablen, ich denke, das ist übersichtlicher für die Wartungs-Programmierer - wer ist in der Regel ein junior-Programmierer - alle-Instanz-level-Initialisierung in den Konstruktor. Ich empfehle eine Variante von option 1.
Ich lieber vermeiden
this
wenn es nicht notwendig ist, da es nichts hinzufügt.Mit
this
fügt nothinig. Es ist keine Klarheit zu gewinnen. Wenn die family reference Person() ist kein member-Referenz-was ist es dann? Ein Pixie?this
ist nur erforderlich, wenn eine lokale variable (oder parameter) verbirgt sich die variable, die auch eine schlechte Praxis ist.InformationsquelleAutor DwB
Ich, wie der zweite Stil besser. Wenn Sie mehr als einen Konstruktor, die Sie nicht haben, wiederholen Sie die Initialisierung und Sie nicht vergessen. Es macht auch deutlich, wie die variable initialisiert wird. In der Regel, wenn das Lesen ein Programm und kommen über eine variable, müssen Sie zuerst gehen, um Ihre Erklärung. Mit dem zweiten Stil, sehen Sie das default-Wert sofort. Mit das erste, was Sie brauchen, um sich an den Konstruktor.
Weder rechnerisch überlegen.
InformationsquelleAutor Foggzie