Erstellen von singleton-Objekt, beste Weg
Erstellen Sie ein singleton-Objekt, und ich fand 3 Möglichkeiten, welche ist besser und warum sind die anderen schlecht. Der Konstruktor wird davon ausgegangen, dass die privaten.
Methode 1:
class ClassX{
private static ClassX objX = null;
static{
objX = new ClassX();
}
//get objX method
}
Methode 2:
class ClassX{
private static ClassX objX = new ClassX();
//get objX method
}
Methode 3:
class ClassX{
private static ClassX objX = null;
public ClassX getInstance(){
if(objX == null)
return new ClassX();
else
return objX;
}
}
- Erwägen Sie die Verwendung einer
enum
. Auch, lazy vs. eager überlegungen sind anwendungsspezifisch. - Ich sehe nur die Methode 3 als singleton-pattern :/
- Dependency injection statt.
- Dann schlage ich vor, möchten Sie vielleicht, um Ihre Augen ausgecheckt 🙂 Alle drei Ausschnitte sind singletons, Methode 3 ist die nur faul initialisiert eine. Das ist, vorausgesetzt, es ist ein
private
Konstruktor, sonst keiner von Ihnen garantieren, ein singleton. (Hängt davon ab, wie definieren Sie diesen Begriff: ein Objekt, von dem nur eine Instanz ist, die jemals erschaffen; oder ein Objekt, von dem nur eine Instanz kann immer erstellt werden.) - Warum sind die anderen beiden nicht-singleton? Sie produzieren auch nur eine Instanz im Leben Zeit.
- Yup, der Konstruktor wird davon ausgegangen, dass die privaten. Habe ich erwähnt, dass.
- möglich, Duplikat der Was ist eine effiziente Methode zum implementieren eines singleton-pattern in Java?
- nicht-singleton-bedeutet "ein Objekt, von dem nur eine Instanz kann immer erstellt werden"?
- Nicht unbedingt. Ich behaupte, dass es kann sowohl bedeuten, je nachdem, ob du den Begriff in ein design (Muster -) Kontext, oder in einer Implementierung ein. Das ist, wenn ich mit dependency injection, und in meiner bootstrap-code immer nur eine Instanz einer Komponente, und füge nur diese Instanz in jedes Objekt, die es braucht, als ein Mitarbeiter, würde ich sagen, diese Komponente ist immer noch ein singleton, obwohl es nichts zu verhindern, dass andere (fälschlicherweise) erstellen einer anderen Instanz.
- Ich immer verwenden Sie Methode 3, aber nicht wissen, es ist faul initialisiert man... ich einfach wikipedia Lesen, und Sie geben ziemlich gute Beschreibung der einzelnen Stil
- Jedenfalls ist nicht die einfachste sichere Weg, dies zu tun
public static final INSTANCE = new Foo();
? - Viele Nutzer/Beantworter hier anscheinend keine völlige Ahnung was genau das singleton-Entwurfsmuster zu lösen versucht. Wenn Sie solche ein, Lesen Sie dieses: en.wikipedia.org/wiki/Singleton_pattern. Der "beste Weg", um es zu implementieren ist entweder die Pugh-oder Enum-Lösung. Je nach den konkreten funktionalen Anforderungen, die der OP nicht sagen, irgendein Wort über die richtige Art und Weise zu erreichen, dass die funktionale Anforderung ist jedoch mehr als oft erstellen Sie einfach ein.
- Ich wünschte, ich könnte upvote diese Bemerkung mehr als einmal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, verwenden Sie ein enum wie diese:-
Schauen Sie sich auch die zugehörigen Antworten:- Was ist eine effiziente Methode zum implementieren eines singleton-pattern in Java?
Zitiere einige Zeilen aus der Die Durchsetzung der Eigenschaft Singleton mit einem Privaten Konstruktor oder einen enum-Typ was Stephen Denne verwendet hat, in der oben genannten Antwort:-
Methode 3 ist nicht thread-sicher, D. H., dass, wenn mehrere Anrufer kommen in der gleichen Zeit, können Sie am Ende mit mehr als ein singleton. Methode 1 und 2 funktioniert und im wesentlichen die gleiche Sache. Sie wollen vielleicht betrachten Sie dieses Beispiel mit double check locking:
Mag es scheinen, albern, aber double-checked-locking thread Sicheres und weit billiger als die Verwendung eines
synchronized
version vongetInstance()
, das macht absolut sicher, dass Sie immer nur 1ClassX
Instanz. Sie können auch zur Weitergabe von Daten angetInstance()
sollten Sie sich entscheiden, verwenden Sie es als eine factory oder einen service locator, die Aufgabe ist es, zu erstellen oder zu speichern singletons.erstellen static final private Instanz & Zugriff auf eine statische getter-und der construtor ist privat natürlich.
oder dependency injection.
Brauchen Sie nicht faul Initialisierung:
Diese wahrscheinlich nicht widerstehen Serialisierung oder Reflexion, aber es sollte gut genug sein, w/r/t thread-Sicherheit. (Natürlich könnte man auch einfach erstellen Sie nur eine Instanz, da habe ich stillschweigend in meinen Kommentaren.)