2017-07-19 2 views
3

Ist es möglich (oder sinnvoll) ein eigener Konstruktor ein Objekt zu verwenden, in? (Sorry für die schlecht Frage formuliert Noob)ein Objekt innerhalb des eigenen Konstruktor

sagen, dass ich eine Klasse „Schüler“ habe, die eine enthält arrayList der Unterklasse Student und eine Methode zum Hinzufügen neuer Schüler zum Array.

Kann ich in meinem Studenten Konstruktor die addStudent Methode verwenden, um die neue Instanz mit dem Array auf Schöpfung hinzuzufügen ... wie so:

//Students 
class Students{ 
    private static ArrayList<Student> STUDENTS = new ArrayList<>(); 
    public static void addStudents(Student student){ 
    STUDENTS.add(student); 
    } 
} 
//Student 
class Student /*extends Students <- old misstake left for reference*/{ 
    private String name = ""; 
    private int birthYear = 0; 

    Student(String _name, int _birthYear){ 
    this.name = _name; 
    this.birthYear = _birthYear; 
    //insert wild guess 
    Students.addStudents(this(name,birthYear)); 
    } 
} 

Oder wird diese einfach Schleife und eine Menge von Objekten erstellen, bis alles stürzt ab?

+1

Was ist der Punkt in der 'STUDENTS' Statik machen? Machen Sie es auch nicht groß, es sei denn, es handelt sich um eine statische endgültige Variable. –

+1

Was ist passiert, als Sie diesen Code ausgeführt haben? –

+3

'Student erweitert Studenten' klingt seltsam. – Berger

Antwort

6

Sie können; Du solltest es einfach nicht tun.

Ein Grund ist, dass Sie nicht immer alle Student Instanzen derselben gemeinsamen Liste hinzufügen möchten. Wenn Sie z. B. Student Instanzen in einem Komponententest erstellen und diese im Konstruktor in die Liste Students einfügen, müssen Sie sich nach dem Test darum kümmern, die Liste zu löschen, um zu vermeiden, dass zwischen den Tests versehentlich der Status freigegeben wird.

Ein weiterer Grund ist, dass das Hinzufügen der Instanz im Konstruktor unsafe Veröffentlichung genannt wird. Sie geben einen Verweis auf eine Instanz aus, die nicht vollständig initialisiert wurde. Dies kann zu einigen sehr kniffligen Fehlern führen, insbesondere im Zusammenhang mit Nebenläufigkeit.

Sie sollten immer warten, bis eine Instanz vollständig initialisiert wurde (d. H. Eine new Whatever zurückgegeben wurde), bevor Sie etwas damit machen.

Sie würden besser entkoppeln beim Erstellen der Student von Hinzufügen zu der Students Liste. Verwenden Sie eine Factory-Methode Studenten zu erstellen:

class Students{ 
    private static ArrayList<Student> STUDENTS = new ArrayList<>(); 
    public static void addStudents(Student student){ 
    STUDENTS.add(student); 
    } 

    // Factory method. 
    public static Student createAndAddStudent(String name, int birthYear) { 
    Student student = new Student(name, birthYear); 
    addStudents(student); 
    return student; 
    } 
} 

In Bezug auf Ihrem aktuellen Code, die Sie nicht extends Students brauchen. Logischerweise ist Student kein Students, mehr als ein Car wäre kein Cars (sag es laut; es macht einfach keinen Sinn).

Alles, was Sie tun müssen, ist die statische Methode aufzurufen:

class Student { 
    Student() { 
    // ... 
    Students.addStudents(this); 
    // ... 
    } 
} 
+0

Große Antwort, erzählte mir alles, was ich brauchte, gab mir ein Beispiel für die Verbesserung, Prost! – LuckyXII

1

Sie verwenden das Schlüsselwort this falsch. Sie senden keine Werte zusammen mit this. this ist eine Referenz auf das aktuelle Objekt.

Der Vorteil dieser Methode besteht darin, dass Sie nie alle Schüler einzeln zu einer Liste hinzufügen müssen. Zusammen damit wird es Ihnen die Mühe ersparen, versehentlich zu vergessen, einen zu Ihrem Array hinzuzufügen.

class Student extends Students{ 
    private String name = ""; 
    private int birthYear = 0; 

    Student(String _name, int _birthYear){ 
     this.name = _name; 
     this.birthYear = _birthYear; 

     addStudents(this); 
    } 

    public static void main(String[] args){ 
     Student s = new Student("Ryan", 1999); 
    } 
} 
Verwandte Themen