Ja, es ist möglich, einen Konstruktor von einem anderen aus aufzurufen. Aber es gibt dafür eine Regel. Wenn ein Aufruf von einem Konstruktor zu einem anderen gemacht wird, dann
der Aufruf des neuen Konstruktors muss die erste Anweisung im aktuellen Konstruktor sein
public class Product {
private int productId;
private String productName;
private double productPrice;
private String category;
public Product(int id, String name) {
this(id,name,1.0);
}
public Product(int id, String name, double price) {
this(id,name,price,"DEFAULT");
}
public Product(int id,String name,double price, String category){
this.productId=id;
this.productName=name;
this.productPrice=price;
this.category=category;
}
}
So etwas wie unten wird also nicht funktionieren.
public Product(int id, String name, double price) {
System.out.println("Calling constructor with price");
this(id,name,price,"DEFAULT");
}
Auch bei der Vererbung wird bei der Erstellung eines Objekts der Unterklasse zunächst der Konstruktor der Oberklasse aufgerufen.
public class SuperClass {
public SuperClass() {
System.out.println("Inside super class constructor");
}
}
public class SubClass extends SuperClass {
public SubClass () {
//Even if we do not add, Java adds the call to super class's constructor like
// super();
System.out.println("Inside sub class constructor");
}
}
Daher wird auch in diesem Fall zunächst ein weiterer Konstruktoraufruf deklariert, bevor andere Anweisungen erfolgen.
2 Stimmen
Ich glaube, die Prämisse Ihrer Frage ist falsch. Anstatt einen Konstruktor innerhalb eines Konstruktors aufzurufen, verwenden Sie das Factory-Muster. Eine statische Factory-Methode erstellt zunächst alle Objekte der unteren Ebene. Dann werden die Objekte der höheren Ebene konstruiert, die vom Factory-Aufruf zurückgegeben werden. Durch diese Technik wird die Komplexität des Modells verringert, was die Wartung, die Klarheit und das Testen erleichtert.
1 Stimmen
Ich bin im Allgemeinen zu privaten Konstruktoren und Fabrikmethoden übergegangen, da Konstruktoren aufgrund ihrer Beschränkungen das Prinzip des offenen und geschlossenen Systems verletzen. Ich denke, dieser Kommentar sollte die richtige Antwort sein, alles andere wird Ihre Teamkollegen nur verwirren.
0 Stimmen
Sroy, aber das ist keine gute Praxis, wenn Sie so etwas tun wollen, überladen Sie den Konstrukteur. Wenn Sie einen Inhalt verpacken möchten, könnte das getan werden, aber für einen anderen Zweck. Nicht der Konstruktor public class Foo { private int x; public Foo() { } public Foo(int x) { this.x = x; } public Foo(int x, int y) { this.x = x; this.y = y }
1 Stimmen
Der Aufruf eines Konstruktors von einem anderen Konstruktor in Java ist in erster Linie ein Mittel, um dem einen Konstruktor, der Ihr Objekt tatsächlich konstruieren soll, Standardwerte für Parameter zur Verfügung zu stellen, und dann sollte es ausreichen, dem Konstruktor Werte zuzuweisen. Wenn Ihr Objekt eine komplexe Konstruktion erfordert, ist das ein Codegeruch, der darauf hinweist, dass es Ihrer Klasse an Kohäsion mangelt. Wenn ein Konstruktor für Sie nicht ausreicht, haben Sie Ihre Klassen wahrscheinlich schlecht entworfen, was Sie feststellen werden, wenn es an der Zeit ist, Änderungen vorzunehmen.
0 Stimmen
Anstatt "this" zu verwenden, warum können wir nicht einfach new verwenden, z. B. innerhalb eines Konstruktors ohne Argumente new Foo(5); ist das korrekt? wenn nicht, warum? @peter