2686 Stimmen

Wie rufe ich in Java einen Konstruktor von einem anderen aus auf?

Ist es möglich, einen Konstruktor von einem anderen aufzurufen (innerhalb der gleichen Klasse, nicht von einer Unterklasse)? Wenn ja, wie? Und was könnte der beste Weg sein, einen anderen Konstruktor aufzurufen (wenn es mehrere Möglichkeiten gibt)?

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 }

2voto

rogerdpack Punkte 55995

Ursprünglich aus einer Antwort von Mirko Klemm, leicht geändert, um die Frage zu beantworten:

Nur der Vollständigkeit halber: Es gibt auch die Instanz-Initialisierungsblock der immer ausgeführt wird, bevor ein anderer Konstruktor aufgerufen wird. Er besteht einfach aus einem Block von Anweisungen "{ ... }" irgendwo im Körper Ihrer Klassendefinition. Sie können sogar mehr als einen haben. Man kann sie nicht aufrufen, aber sie sind wie "gemeinsamer Konstruktor"-Code, wenn man etwas Code über Konstruktoren hinweg wiederverwenden will, ähnlich wie beim Aufruf von Methoden.

In Ihrem Fall also

{ 
  System.out.println("this is shared constructor code executed before the constructor");
  field1 = 3;
}

Es gibt auch eine "statische" Version davon, um statische Mitglieder zu initialisieren: "static { ... }"

0voto

Dies wird als Konstruktorverkettung bezeichnet. Konstruktorverkettung ist der Prozess des Aufrufs eines Konstruktors von einem anderen Konstruktor aus in Bezug auf das aktuelle Objekt. Die Verkettung von Konstruktoren kann auf zwei Arten erfolgen:

1. innerhalb der gleichen Klasse: Dies kann mit dem Schlüsselwort this() für Konstruktoren in derselben Klasse geschehen. 2. von der Basisklasse: mit dem Schlüsselwort super(), um einen Konstruktor der Basisklasse aufzurufen.

-1voto

ansh sachdeva Punkte 840

Ich bevorzuge diesen Weg:

    class User {
        private long id;
        private String username;
        private int imageRes;

    public User() {
        init(defaultID,defaultUsername,defaultRes);
    }
    public User(String username) {
        init(defaultID,username, defaultRes());
    }

    public User(String username, int imageRes) {
        init(defaultID,username, imageRes);
    }

    public User(long id, String username, int imageRes) {
        init(id,username, imageRes);

    }

    private void init(long id, String username, int imageRes) {
        this.id=id;
        this.username = username;
        this.imageRes = imageRes;
    }
}

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