2009-10-22 8 views
5

Es tut mir leid, wenn dies ein Duplikat oder zu elementar ist, aber wie mache ich eine Singleton-Klasse, die unterklassifiziert werden kann?Wie kann ich andere Klassen von einer Singleton-Klasse ableiten?

+1

Warum der Downvote? Dies scheint eine legitime Frage zu sein. –

+1

Vielleicht hat der Downvoter vor kurzem zu Abend gegessen und fühlt sich momentan gesättigt, so dass die "Ernährungs" -Referenz unattraktiv war ...? –

+0

Entschuldigung @Alex. Ich habe deinen Witz ruiniert, als du ihn gepostet hast. –

Antwort

11

Steve Yegge hat eine amüsante article über Singletons, die in diesem Zitat erwähnt Subklassen:

Dann gibt es die Subklassifizieren Sache. Es ist fast unmöglich, eine Singleton Unterklasse, und wenn Sie es verwalten, dann sollten Sie keinen Singleton an erster Stelle verwendet haben. Sie nicht sogar wollen dorthin gehen. Ich habe gelaufene Straßen, die ich nicht zu erzählen wage. Tun Sie einfach, Sie können es nicht tun, und Sie sparen sich erstaunliche Mengen Schmerzen.

+0

Also ist die Antwort "NEIN"? – unj2

+1

Wenn Sie es so lesen wollen, dann ja, es ist nein. Oder du könntest es lesen und sehen, dass die Antwort ja ist, aber du solltest es immer noch nicht versuchen, und du solltest vielleicht herausfinden, warum du überhaupt ein Singleton verwendest. –

5

Sie können im Allgemeinen nicht, in irgendeinem nützlichen Sinne. Dies wäre ein weiterer Grund, keine Singleton-Klassen zu verwenden.

1

Wenn Sie Ihre Singleton definiert als:

public class Singleton { 
    private static Singleton instance; 
    public static Singleton getInstance() { 
    if (instance == null) { 
     instance = new Singleton(); 
    } 
    return instance; 
    } 
    private Singleton() { 
    } 
} 

Dann können Sie einfach tun:

public class NewSingleton extends Singleton { 
} 

Aber Sie werden nicht in der Lage sein, die privaten Methoden zu verwenden, so, wenn Sie wollen Benutze den Singleton, den du immer noch anrufen musst, um Singleton.getInstance(); zu erhalten.

Aber es gibt keinen Grund, warum Sie es nicht tun können.

Wenn Sie nun der Singleton-Klasse weitere Funktionen hinzufügen möchten, können Sie Inter-Type-Aspekte von AspectJ verwenden und einfach neue Methoden/Eigenschaften in den Singleton einfügen, die dann vom Singleton verwendet werden können.

1

Singleton begrenzt Instanzen nicht die Vererbung. Nun - wie bereits erwähnt, begrenzt es die Nützlichkeit der Vererbung und dann können Sie private Konstrukteur zu packen oder geschützt (was Sie argumentieren können verringert Singletoness des Singletons) Aber was ist der Zweck?

3

Eigentlich glaube ich nicht, dass es möglich ist.

Sie machen eine Klasse singleton, indem Sie ihre Konstruktoren als private deklarieren. Wenn Sie dann jedoch versuchen, eine Unterklasse Ihrer Singleton-Klasse zu deklarieren, wird der Unterklassenkonstruktor nicht in der Lage sein, die Konstruktoren der Oberklasse zu sehen ... also werden sie nicht kompilieren; z.B.

public class A() { 
    private A() { } 
} 

public class B() { 
    private B() { } 
} 

Sowohl die Sun JDK 1.6 und Eclipse Ganymede Compiler gibt einen Übersetzungsfehler im Konstruktor B, zu dem Effekt, dass der nicht-args Konstruktor für A nicht sichtbar ist.

Sie könnten die Sichtbarkeit der private Konstruktoren erhöhen, aber dann gibt es nichts (abgesehen von gutem Sinn), jemanden davon abzuhalten, mehrere Instanzen davon zu erstellen. Mit anderen Worten, es ist nicht mehr wirklich eine Singleton-Klasse.

EDIT: Ich denke, eine koscher Alternative wäre, einen Baum von einer oder mehreren abstrakten (Nicht-Singleton) Klassen mit den Methoden/Mitglieder, die Sie wollen, zu definieren, und dann mehrere Singleton-Klassen als Blatt Klassen definieren wie angemessen. Aber das ist KEINE Singleton-Klasse, die eine andere unterklassifiziert.

+0

Es kompiliert ... Ich bin Idiot genug, um meine Zeit auf die Schaffung von 2 Test-Klassen. So ist es (zumindest - keine Argument Konstruktoren) – Bostone

+0

Oh Ochsen - 'Waste' das ist – Bostone

+0

Was haben Rinder damit zu tun ??? :-) –

0

Wie andere schon geantwortet haben, sind die Verwendungen von Singleton-Unterklassen gering. Wenn Sie ein Strategie-Pattern im Kontext eines Singleton benötigen, können Sie eine Schnittstelle definieren und an eine Implementierung dieser Schnittstelle in der Singleton-Instanz delegieren. Dies verschiebt das Problem um eine Ebene und verdeutlicht, warum Sie es tun möchten.

Um Ihre Frage zu beantworten; unter der Annahme, verwendet die Wahl für die jeweilige Unterklasse der Anwendung die Systemeigenschaften in zum Beispiel definiert ist, können Sie so etwas wie tun:

public static synchronised Singleton getInstance() { 
    if (instance == null) { 
     String clsName = System.getProperties().getProperty("singleton.class"); 
     if (className == null || 0 == clasName.length()) { 
      instance = new Singleton(); 
     } else { 
      Class cls = Class.forName(clsName); 
      instance = (Singleton) cls.newInstance(); 
     } 
    } 
    return instance; 
} 

Haftungsausschluss: ungetesteten Code, Ausnahmebehandlung hinzufügen, etc. :-) Btw, stellen Sie sicher, Ihre getInstance() Methode ist synchronisiert.

Verwandte Themen