Wenn wir gehen sollten, für eine Singleton-Klasse in Java?
Als pro meine Gedanken, sollten wir eine Klasse als Singleton, wenn wir teilen die gleichen Objektes in der Anwendung. In diesem Fall wollen wir die Benutzer zu beschränken, erstellen Sie eine neue Instanz jedes mal so, dass Sie nicht verwalten mehrere Staaten. Vereinbart. Aber das gleiche Verhalten kann acheved, indem Sie durch die Deklaration der Instanz-Variablen als statisch. Für mich sieht es aus, wird es auch dem gleichen Zweck dienen, ob seine cacheobjectcontainer
, logger
oder Classloader
Klasse.
Bitte helfen Sie mir zu verstehen, über Konzept, bei dem die statische Instanz-variable wird nicht lösen den Zweck und die Klasse deklariert werden muss Singleton?
Bearbeitet Teil
Ok, lassen Sie mich bringen etwas mehr Klarheit . Der Zweck des singleton-Klasse wird nur eine Instanz der singleton-Klasse über jvm. Vereinbart. Aber ich bin versucht zu denken, der Gründe, warum wir wollen, das nur eine Instanz. Kann es zwei Gründe:
1) Objekt zwar teuer, zu erstellen. Also wir wollen nur zu halten, nur eine Instanz. Vereinbart wurde in diesem Szenario deklarieren von Instanzvariablen als static löst keine Zweck.
2) wollen Wir teilen den gleichen Zustand des Objekts über die Anwendung. Ich dachte, dies ist das Hauptziel der Deklaration der Klasse als singleton. Aber es kann erreicht werden, einfach durch die Deklaration der Instanz-Variablen als statisch.
Aber sieht aus wie 1 ist der Hauptgrund der delaring jede Klasse als statische, nicht Grund 2, denn es kann erreicht werden, mit statischen Variablen auch.
Ist das richtig?
Mögliche Duplikate von: stackoverflow.com/questions/4723245/...
InformationsquelleAutor M Sach | 2011-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deklaration der Instanz-Variablen macht, dass die Referenz ein statisches Objekt. Dh es gibt nur eine Instanz für , dass Klasse. Aber es hört nicht auf jemand anderes zu tun
new SomeObject()
unabhängig davon, ob es statische Referenz. Die Idee, dass eine singleton-Klasse ist die Kontrolle der Instanzen. Zum Beispiel, wenn Sie den Konstruktorprivate
Sie nicht wollen, einenew
um eine neue Instanz erstellen. Damit Steuern Sie die Erstellung der Instanzen.Ich bin verwirrt, wie eine statische Instanz-variable können Sie diese erreichen? Könnte ich noch erstellen Sie eine neue Instanz der Klasse und verwenden Sie es in meiner eigenen Klasse? Das lehrbuch-Beispiel für ein singleton ist eine Datenbank-Verbindung. Sie können nur eine Verbindung für Ihre Anwendung und auch nicht zulassen, dass jemand, um neue Instanzen zu erstellen. Neue Instanzen erstellen können weitere verbindungen erstellen, das könnte unerwünscht sein.
Ok, was hab ich von yoyr Antworten ist der Zweck des singleton-Klasse wird nicht den gleichen Zustand des Objekts über die Anwendung, sondern um die control-Instanz zu . Aber warum dann die logger-Klasse singleton?
logger ist ein singleton, weil im Allgemeinen Sie wollen ein logger pro Klasse. Also, wenn Sie
Logger.getLogger(getClass())
es sieht für einen logger, der vielleicht schon vorhanden ist und wiederverwendet werden. Wenn stattdessen, wenn Sie hattenew Logger(getClass())
Sie könnte das gleiche logger erstellt mehrmals, wenn es bereits erstellt.Vereinbart.Was wird das Problem sein, wenn gleiche logger erstellt mehrmals, wenn es bereits erstellt. Versucht man die Wurzel der Ursache. Vielen Dank für das ertragen von mir Amir
InformationsquelleAutor Amir Raminfar
der Hauptunterschied ist, dass ein singleton ist eine normale Instanz, können Sie z.B. verwenden, als parameter. Singletons können auch Schnittstellen implementieren.
Matteo
InformationsquelleAutor Matteo
Mehrere gute Antworten bisher.
Diese Wenn ein Singleton ist kein Singleton Artikel drückt das Konzept gut.
Hier sind einige weitere Unterschiede:
InformationsquelleAutor rajah9
Wenn Sie immer denken, dass Sie möglicherweise nutzen wollen, Vererbung oder Schnittstellen, werden Sie wollen, um ein Aktuelles Beispiel, anstatt eine statische Klasse. Was zum Beispiel, wenn Sie möchten, um Ihre Instanz, um etwas zu tun, etwas anders als es normalerweise tun würde? Sie können die singleton-Wert auf eine Instanz einer anderen Implementierung von der Schnittstelle, oder einer abgeleiteten Klasse überschreibt bestimmte Funktionen. Der gesamte code, der darauf zugreift, die singleton-Instanz verwenden können, es in genau der gleichen Weise, aber sein Verhalten verändert werden kann.
Ich würde allerdings hinzufügen, dass beide Singletons und statische Klassen sind als anti-Muster in diesen Tagen. Besser, dependency injection, und verwenden nur einen singleton verbindlich, wenn Sie wollen, singleton-Verhalten.
Update
Nach dem Lesen der Frage wieder, es klingt wie Sie denken, etwas wie das zu tun:
... die Vermutung war, dass
systemName
wird sich nie ändern, und so ist es egal, wenn es angesprochen wird, alsnew SessionManager().getSystemName()
versusSessionManager.getInstance().getSystemName()
. In diesem Fall:new SessionManager()
Sie erwarten, dass etwasnew
erstellt wird. Es ist nicht sofort offensichtlich, dass jedesSessionManager
im system ist immer die gleichesystemName
. Also ein singleton kann ratsam sein, einfach, um es deutlicher zu Verbraucher, dass Sie es mit einem singleton-Zustand.new SessionManager()
, die müssen später wieder Müll gesammelt werden.Andere als das, Sie haben im Grunde die gleichen Vorteile und Nachteile, die mit diesem Ansatz, wenn Sie ein Singleton. Werd ich wiederhole meine frühere Aussage, aber: Singletons sind ein anti-pattern. Lieber dependency injection.
Aktualisiert, basierend auf dem neuen Verständnis, die Frage.
Es ist möglich, zu implementieren eines singleton mit einem
enum
und vermeiden Sie die meisten Probleme des singleton-Objekte in der (nicht-enum-Klassen. Der Nachteil ist, dass Sie nicht die Unterklasse.Lazarus: ich denke nicht, dass die Implementierung eines singleton mit einem
enum
keine der Probleme, die ich mich beziehe: Siehe accu.org/index.php/journals/337 für eine Idee.Zwei Beispiele der traditionellen singleton-Probleme vermeiden, die Sprache, die Ebene mit enums: (1) Eindeutigkeit unter der (de -) Serialisierung; (2) Nicht-einzigartige Konstruktion über die Reflexion. [Obwohl ich gehört habe JVM-gurus kann man irgendwie konstruieren Kopien von enums, es ist kaum etwas, was Sie sehen würden, in ordentlichen code.]
InformationsquelleAutor StriplingWarrior