2016-06-02 12 views
2

Im Allgemeinen habe ich gesehen, dass Instanzvariablen in einer Singleton-Klasse privat gehalten werden. Aber ist es möglich, es nicht privat zu halten? Was passiert, wenn wir eine Instanz wie folgt erklären: -Können wir eine Singleton-Klasse erstellen, indem wir nicht private instanceName haben?

final static SingletonClass singletonInstance= new SingletonClass(); 

Wird es ein Problem für die Klasse verursachen eine gültige Singleton Klasse zu sein?

+0

Sie stellen hier wirklich zwei Fragen: Können wir eine Singleton-Klasse erstellen, indem wir einen nicht privaten instanceName haben UND was passiert, wenn ich versuche, ein zweites Objekt einer Singleton-Klasse zu erstellen? Richtig? –

+0

Nein. Zweite Frage ist; ist mein Ansatz, die letzte Instanz korrekt zu verwenden? @blahfunk – shanti

Antwort

1

Die singleton pattern stellt sicher, dass es sich um eine einzelne Instanz dieser Klasse im System zu einem bestimmten Zeitpunkt handelt. Das Muster sagt nichts über public/private aus

Implementierungen können variieren, solange eine einzige Instanz verfügbar ist.

In Ihrem Fall, wenn alle Konstruktoren privat sind und der Rest der Klassen Zugriff auf den Singleton erhalten wird, so wird SingletonClass.singletonInstance das Singleton-Muster erfüllt.

+0

Danke, das ist besser Antwort :) – shanti

0

Der einzige sichtbare Unterschied hängt davon ab, wie sich die JVM verhält. Dabei ist es möglich, dass die Klasse zugewiesen wird, bevor auf sie zugegriffen wird. Dies ist jetzt nicht oder nicht wahr, aber dies schafft eine Abhängigkeit von der Sprachimplementierung, während der klassische Ansatz die Initialisierung in den Händen der ersten lässt Anrufer.

EDIT1:

Technisch wird es noch eine gültige Singleton-Klasse sein, vorausgesetzt, dass die JVM Thread-Sicherheit in einem solchen Zugriffsszenario gewährleistet. Ich würde diesen Ansatz im Allgemeinen vermeiden, da Sie keine Möglichkeit haben, die Erstellung für den Fall zu synchronisieren, dass es notwendig ist, was die Instanz als Singleton verletzen würde.

+0

Ja oder Nein? Macht eine letzte Instanz eine richtige Lösung? – shanti

+0

Siehe meine Bearbeitung @shanti –

+0

Wie bringen Zugriffsmodifikatoren Threadsicherheit in Bild? Wir können uns immer um diesen Teil kümmern, indem wir uns auf Constructor oder die Methode getInstance der Singleton-Klasse konzentrieren. Ist es nicht? – shanti

1

Wir machen Instanzvariable privat, weil wir die volle Kontrolle darüber haben wollen (In Ihrem Fall machen Sie es endgültig und statisch, also bevor jemand es benutzen kann, hat es einen Wert und später kann es nicht geändert werden).

Aber es gibt einige Punkte dagegen:

1) Wenn die Variable privat und nicht statisch, Übliche Singleton Design wird nicht Variable initialisieren, bis irgendwo wir es (Lazy Loading) verwenden möchten.

2) Wir sollten den Umfang der Variablen/Funktion so weit wie möglich minimieren. Wenn Sie nicht möchten, dass jemand es direkt ändert, dann stellen Sie es nicht (besserer Entwurf) zur Verfügung

Nur Pluspunkt, den ich sehen kann, ist, Sie müssen sich nicht um Threadsicherheit kümmern (im üblichen Singleton müssen Sie sich kümmern Wenn Sie Multithread-Anwendungen haben)

+0

Ja, ich selbst habe diesen Pluspunkt verpasst! Damit es endgültig ist, muss ich mich nicht um den Thread-Sicherheitsteil kümmern. Groß! :) – shanti

Verwandte Themen