2010-10-17 4 views
39

Angenommen, wir haben den folgenden Code:erstreckt sich von der Klasse mit privaten Konstruktor

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 One schaffen, das ursprünglich die übergeordnete Klasse Konstruktor Test() genannt. aber als Test() war privat - wir erhalten einen Fehler. Wie viel ist ein gutes Beispiel und ein Ausweg aus dieser Situation?

Antwort

39

Es gibt keinen Ausweg. Sie müssen einen verfügbaren (protected, public oder Standard) Superkonstruktor erstellen, um test zu erweitern.

Diese Art von Notation wird normalerweise in Utility-Klassen oder Singletons verwendet, in denen Sie nicht möchten, dass der Benutzer eine Instanz Ihrer Klasse erstellt, indem er sie erweitert und die Unterklasse instanziiert oder einfach einen Konstruktor von deine Klasse.

Wenn Sie eine class mit nur private Konstrukteure haben, können Sie auch die class-final ändern, weil es überhaupt nicht erweitert werden kann.


wäre eine andere Lösung, die ein Verfahren in test werden, die sich von One zu einer Instanz test Instanzen test und delegieren jeden Methodenaufruf erstellen. Auf diese Weise müssen Sie nicht test erweitern.

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(); 
    } 
} 
+4

Die Methode 'getInstance()' der Klasse 'Test' sollte statisch sein. Andernfalls ist es nicht möglich, einen Aufruf wie 'Test.getInstance()' aufzurufen. – vanje

+0

@vanje, danke, aktualisiert –

1

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

BTW, Ihre Beispielcode enthält einige Probleme:

  • Klassen sollten Titel Fall (Test statt test)
  • Ich schlage vor, nennen würde die One ‚Konstruktor private zu machen, es sei denn es ist aus einer anderen Klasse im selben Paket aufgerufen
+0

Wenn Sie nicht den Quellcode von Test haben? – powder366

0

Eigentlich fand ich, dass es einen Ausweg gibt. Wie folgt:

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

+5

Dies funktioniert nur, wenn eine statische innere Klasse platziert wird, da private Methoden für innere Klassen zugänglich sind. Leider hilft das nicht, denn wenn Sie in der Lage sind, die Klasse zu ändern, werden Sie viel besser bedient, indem Sie den Konstruktor auf "geschützt" oder "öffentlich" setzen. –

Verwandte Themen