2016-05-06 16 views
0

Ich sah eine andere Vielzahl von Implementierungen der Singleton-Klasse. Diese bestimmte Implementierung: https://sourcemaking.com/design_patterns/singleton/java/1 erstellt das Objekt in einem privaten Konstruktor jedoch nicht.Singleton Design Pattern Implementierung

Kann jemand erklären, was die Vor- oder Nachteile zwischen den beiden Implementierungen wären? Die Beschreibung ist minimal und ich habe nicht viel davon verstanden.

Danke.

+0

Mögliches Duplikat [Differenz zwischen Singletonklasse und statische Klasse?] (http://stackoverflow.com/questions/3714971/difference-between-singleton-class-and-static-class) – sinclair

+1

Werfen Sie einen Blick auf: http://javarevisited.blogspot.de/2013/ 03/difference-between-singleton-pattern-vs-static-class-java.html – sinclair

Antwort

2

Der Link, den Sie sehr gut erklärt vorgesehen, wenn kurz und bündig ... aber lassen Sie mich versuchen ...

Die innere Klasse nicht früher verwiesen wird, zu erweitern (und geladen deshalb nicht früher von dem Klassenlader) als der Moment, in dem getInstance() aufgerufen wird.

Dies ist der wichtigste Teil der Erklärung. Die innere Klasse, auf die sich der obige Text bezieht, ist die Klasse SingletonHolder, die nur für den Zweck existiert, eine Instanz von Singleton zu halten.

Da diese Klasse ist privat und nicht irgendwo anders bezeichnet, ist gewährleistet, dass diese Klasse (geladen von der Java-Classloader) nicht initialisiert werden, bis die getInstance() Methode der Singleton genannt wird, denn das ist die früheste ist eine JVM erforderlich ist um diese Klasse zu initialisieren.

Wenn eine Klasse initialisiert wird, werden statische statische Felder (und statische Blöcke) initialisiert, bevor die Klasse für einen Benutzercode verfügbar gemacht wird. Diese Initialisierung ist Thread-sicher, so dass der Code, der dieses Muster verwendet, keine der komplizierten Synchronisationslogik benötigt, die Sie normalerweise in anderen Implementierungen des Singleton-Musters in Java finden.

Weitere Informationen zu alternativen Implementierungen, einschließlich der enum basierten Lösung sowie der komplizierteren, explizit synchronisierten Versionen von Singleton, finden Sie unter this question.

Beachten Sie, dass, wenn Sie nicht über die Sie Ihre Singletons faul belastete egal (. Dh nur initialisiert, wenn erforderlich), dann benutzen Sie einfach die einfachste Art und Weise:

class Singleton { 
    public static final INSTANCE = new Singleton(); 
    private Singleton() { /* cannot be instantiated externally */ } 
}