erweitert die Klasse mit privatem Konstruktor

Lesezeit: 2 Minuten

Benutzeravatar von user471011
Benutzer471011

Angenommen, wir haben den folgenden Code:

class Test {
    private Test() {
        System.out.println("test");
    }

}

public class One extends Test {

    One() {
        System.out.println("One");
    }

    public static void main(String args[]) {

        new One();
    }
}

Wenn wir ein Objekt erstellen Onedie ursprünglich als übergeordneter Klassenkonstruktor bezeichnet wurde Test(). aber Test() war privat – wir bekommen einen Fehler. Wie viel ist ein gutes Beispiel und ein Ausweg aus dieser Situation?

Benutzeravatar von Colin Hebert
Colin Herbert

Es gibt keinen Ausweg. Sie müssen eine verfügbare (protected, public oder Standard) Superkonstruktor erweitern zu können test.

Diese Art der Notation wird normalerweise in Hilfsklassen oder Singletons verwendet, wo Sie nicht möchten, dass der Benutzer selbst eine Instanz Ihrer Klasse erstellt, entweder durch Erweitern und Instanziieren der Unterklasse oder durch einfaches Aufrufen eines Konstruktors Ihrer Klasse.

Wenn Sie eine haben class nur mit private Konstruktoren können Sie auch die ändern class Zu final weil es gar nicht erweiterbar ist.


Eine andere Lösung wäre eine Methode in test die Instanzen von erstellen test und delegieren Sie jeden Methodenaufruf von One zu einem test Beispiel. Auf diese Weise müssen Sie nicht verlängern test.

class Test {
    private Test() {
        System.out.println("test");
    }
    public static Test getInstance(){
        return new Test();
    }
    public void methodA(){
        //Some kind of implementation
    }
}

public class One {
    private final Test test;
    One() {
        System.out.println("One");
        test = Test.getInstance();
    }

    public void methodA(){
        test.methodA();
    }

    public static void main(String args[]) {
        new One();
    }
}

  • Die Methode getInstance() der Klasse Test sollte statisch sein. Ansonsten ist es nicht möglich, wie zu telefonieren Test.getInstance().

    – Vanje

    17. Oktober 2010 um 11:37 Uhr

Machen Sie den Konstruktor von test nicht-private oder bewegen One hinein test.

Übrigens enthält Ihr Beispielcode einige Probleme:

  • Klassen sollten Titelfall (Test anstatt test)
  • Ich würde vorschlagen, das zu machen OneDer Konstruktor von private es sei denn, es wird von einer anderen Klasse im selben Paket aufgerufen

Benutzeravatar von delphifirst
Delphizuerst

Eigentlich habe ich herausgefunden, dass es einen Ausweg gibt. So was:

class Base {
    private Base() {

    }

    public void fn() {
        System.out.println("Base");
    }

    public static class Child extends Base {
        public void fn() {
            System.out.println("Child");
        }
    }

    public static Base getChild() {
        return new Child();
    }
}

Jetzt können Sie getChild() verwenden, um eine Instanz der erweiterten Klasse zu erhalten.

  • Dies funktioniert nur beim Platzieren einer statischen inneren Klasse, da private Methoden für innere Klassen zugänglich sind. Leider hilft das nicht, denn wenn Sie die Klasse ändern können, sind Sie viel besser bedient, wenn Sie den Konstruktor von vornherein auf geschützt oder öffentlich setzen.

    – Lodewijk Bogaards

    23. Februar 2015 um 18:07 Uhr

1449850cookie-checkerweitert die Klasse mit privatem Konstruktor

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy