Ich muss eine Singleton-Klasse erstellen, ohne eine statische Methode beizubehalten.
Wie kann ich das tun?
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.
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.
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.
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.
Tags und Links java design-patterns singleton