Erstellen einer Klasse singleton ohne Verwendung der statischen Methode

7

Ich muss eine Singleton-Klasse erstellen, ohne eine statische Methode beizubehalten.

Wie kann ich das tun?

    
Sunny Gupta 22.12.2011, 10:41
quelle

7 Antworten

19

Erstellen Sie eine Aufzählung mit einer Instanz

%Vor%

BEARBEITEN: Das Java Enum Tutorial zeigt Ihnen, wie Sie Felder und Methoden hinzufügen können ein enum.

Übrigens: Wenn Sie ein Singleton verwenden können, brauchen Sie es nicht wirklich, da die Utility-Klasse dasselbe tut. Die noch kürzere Version ist nur

%Vor%

Wo Singles nützlich sind, wenn sie eine Schnittstelle implementieren. Dies ist besonders nützlich für Tests, wenn Sie Dependency-Injektion verwenden. (Eine der Schwächen beim Verwenden einer Singleton- oder Dienstprogrammklassensubstitution in Komponententests)

z.B.

%Vor%

Wie Sie sehen können, wenn Ihr Code TimeService überall verwendet, können Sie entweder VanillaTimeService.INSTANCE oder new FixedTimeService() eingeben, wo Sie die Zeit extern steuern können, dh Ihre Zeitstempel sind bei jedem Test identisch.

Kurz gesagt, wenn Sie Ihr Singleton nicht benötigen, um eine Schnittstelle zu implementieren, brauchen Sie nur eine Dienstprogrammklasse.

    
Peter Lawrey 22.12.2011, 10:43
quelle
8
%Vor%

verwenden Sie dann

%Vor%     
andrey 22.12.2011 10:50
quelle
2

Ein anderer Ansatz ist das Singleton-Halter-Idiom , das auf Anfrage eine Initialisierung bietet:

%Vor%

(Beispiel geändert, getInstance-Methode nicht statisch gemacht)

Beachten Sie, dass eigenständige Singletons wie diese möglichst vermieden werden sollten, da sie den globalen Status fördern, zu schwer zu kombinierendem Code führen und von einem einzelnen Klassenlader-Kontext abhängen, um einige mögliche Nachteile zu benennen.

    
Adriaan Koster 22.12.2011 11:50
quelle
1

Folgen Sie dem Joshua Bloch Enum Rezept in "Effective Java" 2. Auflage. Das ist der beste Weg, ein Singleton zu erstellen.

Ich verstehe nicht, warum das so viel ist. Ist Singleton nicht ein diskreditiertes Designmuster? Die GoF würden heute vor der Insel abstimmen.

    
duffymo 22.12.2011 10:43
quelle
1

Sie können einen der IoC-Container verwenden (z. B. Google Guice ) und Ihre Klasse als Singleton verwenden (eager oder faul - es hängt von Ihren Bedürfnissen ab). Es ist einfach und flexibel, da die Instanziierung vom IoC-Framework gesteuert wird - Sie benötigen keine Code-Änderungen, wenn Sie beispielsweise entscheiden, Ihre Klasse nicht zu einem Singleton zu machen.

    
Artem 22.12.2011 10:49
quelle
0

Verwenden Sie eine Objektfactory, holen Sie Ihr Singleton-Objekt von dieser Factory.

%Vor%

Natürlich gibt es viele Frameworks, die Ihnen dabei helfen. der Frühling Rahmen ist eine beliebte Wahl.

    
Wint 22.12.2011 10:52
quelle
0

Von innerhalb des Konstruktors müssen Sie chceck, wenn es bereits eine Instanz der Klasse irgendwo gibt. Sie müssen also den Verweis auf Ihre Singleton-Instanz in einer statischen Variablen oder Klasse speichern. Dann würde ich im Contructor von Singleton immer prüfen, ob es eine Instanz der Singleton-Klasse gibt. Wenn ja, würde ich nichts tun, wenn nicht, würde ich es schaffen und Referenz setzen.

    
Eduard 22.12.2011 11:01
quelle

Tags und Links