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?
Antwort
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.
Also ist die Antwort "NEIN"? – unj2
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. –
Sie können im Allgemeinen nicht, in irgendeinem nützlichen Sinne. Dies wäre ein weiterer Grund, keine Singleton-Klassen zu verwenden.
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.
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?
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.
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.
- 1. Wie kann ich UIView ableiten?
- 2. Wie kann ich dynamisch abgeleitete Klassen von einer Basisklasse erstellen
- 3. Erweitern eines Singletonklasse
- 4. in C++, kann ich eine Klasse von einer Struktur ableiten
- 5. Ableiten einer Klasse von einer abgeleiteten Klasse
- 6. Kann ich Show teilweise ableiten?
- 7. Kann ich UIView in Swift prägnanter ableiten?
- 8. Ableiten von Klassen generiert von Entity Framework in C#
- 9. Kann ich von einer Klasse ableiten, die nur von einer "Fabrik" erstellt werden kann?
- 10. Ableiten von einer Klasse mit Operator überladen
- 11. Extend abstrakte Singletonklasse
- 12. Warum kann ich datetime.date nicht ableiten?
- 13. Kann ich den Typ einer Eigenschaft im Delegaten ableiten?
- 14. wpf - Bindung Datacontext statische Eigenschaften von Singletonklasse
- 15. hashCode Implementierung für Singletonklasse
- 16. Warum kann ich Show hier nicht ableiten?
- 17. kann Proxy einige Klassen, andere aber nicht
- 18. Kraft aus einer Klasse ableiten praktisch
- 19. Ableiten von einer Klasse mit Annotation @PostConstruct
- 20. kann ableiten nicht (m ~ m1)
- 21. Wie erstelle ich eine Klasse, die andere Klassen mithilfe von String-Parametern automatisch initialisieren kann
- 22. Wie übergebe ich Objekte aus meiner Hauptklasse an andere Klassen
- 23. Algorithmen zum Ableiten einer Timeline/Chronologie
- 24. Wie eine andere Klassen Methoden aus einer anderen Klasse aufrufen?
- 25. java.security.ProviderException: Kann nicht ableiten Schlüssel
- 26. Wann sollte ich eine Klasse von QObject ableiten?
- 27. Kann ich eine abstrakte Klasse ableiten, die eine andere abstrakte Klasse hat, die ebenfalls unterklassifiziert ist? (C#)
- 28. Wie kann ich Klassen in einer ausführbaren .net-Datei verweisen?
- 29. Wie übergibt man Daten von onSuccess an andere Klassen?
- 30. Kann ich eine mit dem Interface Builder erstellte Ansicht ableiten?
Warum der Downvote? Dies scheint eine legitime Frage zu sein. –
Vielleicht hat der Downvoter vor kurzem zu Abend gegessen und fühlt sich momentan gesättigt, so dass die "Ernährungs" -Referenz unattraktiv war ...? –
Entschuldigung @Alex. Ich habe deinen Witz ruiniert, als du ihn gepostet hast. –