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 }

7voto

John McClane Punkte 3338

Sie können einen anderen Konstruktor über die this(...) Schlüsselwort (wenn Sie einen Konstruktor aus derselben Klasse aufrufen müssen) oder das super(...) Schlüsselwort (wenn Sie einen Konstruktor aus einer Oberklasse aufrufen müssen).

Allerdings muss ein solcher Aufruf die erste Anweisung Ihres Konstruktors. An überwinden. diese Einschränkung, Verwendung diese Antwort .

6voto

S. Mayol Punkte 2217

Das Schlüsselwort este kann verwendet werden, um einen Konstruktor von einem anderen Konstruktor aus aufzurufen. Wenn man mehrere Konstruktoren für eine Klasse schreibt, kann es vorkommen, dass man einen Konstruktor von einem anderen aus aufrufen möchte, um doppelten Code zu vermeiden.

Unten ist ein Link, dass ich andere Thema über Konstruktor und getters() und setters() zu erklären und ich verwendet eine Klasse mit zwei Konstruktoren. Ich hoffe, die Erklärungen und Beispiele helfen Ihnen.

Setter-Methoden oder -Konstruktoren

5voto

Negi Rox Punkte 3636

Ich weiß, es gibt so viele Beispiele für diese Frage, aber was ich gefunden habe, setze ich hier, um meine Idee zu teilen. es gibt zwei Möglichkeiten, Konstruktor Kette. In der gleichen Klasse können Sie dieses Schlüsselwort verwenden. in Vererbung, müssen Sie super Schlüsselwort verwenden.

    import java.util.*;
    import java.lang.*;

    class Test
    {  
        public static void main(String args[])
        {
            Dog d = new Dog(); // Both Calling Same Constructor of Parent Class i.e. 0 args Constructor.
            Dog cs = new Dog("Bite"); // Both Calling Same Constructor of Parent Class i.e. 0 args Constructor.

            // You need to Explicitly tell the java compiler to use Argument constructor so you need to use "super" key word
            System.out.println("------------------------------");
            Cat c = new Cat();
            Cat caty = new Cat("10");

            System.out.println("------------------------------");
            // Self s = new Self();
            Self ss = new Self("self");
        }
    }

    class Animal
    {
        String i;

        public Animal()
        {
            i = "10";
            System.out.println("Animal Constructor :" +i);
        }
        public Animal(String h)
        {
            i = "20";
            System.out.println("Animal Constructor Habit :"+ i);
        }
    }

    class Dog extends Animal
    {
        public Dog()
        {
            System.out.println("Dog Constructor");
        }
        public Dog(String h)
        {
            System.out.println("Dog Constructor with habit");
        }
    }

    class Cat extends Animal
    {
        public Cat()
        {
            System.out.println("Cat Constructor");
        }
        public Cat(String i)
        {
            super(i); // Calling Super Class Paremetrize Constructor.
            System.out.println("Cat Constructor with habit");
        }
    }

    class Self
    {
        public Self()
        {
            System.out.println("Self Constructor");
        }
        public Self(String h)
        {
            this(); // Explicitly calling 0 args constructor. 
            System.out.println("Slef Constructor with value");
        }
    }

5voto

Soni K Punkte 150

Ja, Sie können Konstruktoren von einem anderen Konstruktor aus aufrufen. Zum Beispiel:

public class Animal {
    private int animalType;

    public Animal() {
        this(1); //here this(1) internally make call to Animal(1);
    }

    public Animal(int animalType) {
        this.animalType = animalType;
    }
}

können Sie auch im Detail nachlesen unter Verkettung von Konstruktoren in Java

0 Stimmen

Gibt es eine Möglichkeit, es auf den Kopf zu tun? von Tier rufen Sie die keine Args Animal Konstruktor? ich versuchte und sieht aus wie es nicht funktioniert.

4voto

Omar Faroque Anik Punkte 2393

Es heißt Telescoping Constructor Anti-Pattern oder Konstruktorverkettung. Ja, das kann man definitiv tun. Ich habe oben viele Beispiele gesehen und ich möchte hinzufügen, dass es in Ordnung ist, wenn Sie wissen, dass Sie nur zwei oder drei Konstruktoren benötigen. Aber wenn Sie mehr brauchen, versuchen Sie bitte, ein anderes Entwurfsmuster wie das Builder-Muster zu verwenden. Wie zum Beispiel:

 public Omar(){};
 public Omar(a){};
 public Omar(a,b){};
 public Omar(a,b,c){};
 public Omar(a,b,c,d){};
 ...

Sie brauchen vielleicht mehr. Builder-Muster wäre eine großartige Lösung in diesem Fall sein. Hier ist ein Artikel, er könnte hilfreich sein https://medium.com/@modestofiguereo/design-patterns-2-das-builder-pattern-und-das-teleskopierende-konstruktor-anti-pattern-60a33de7522e

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