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 */ }
}
Mögliches Duplikat [Differenz zwischen Singletonklasse und statische Klasse?] (http://stackoverflow.com/questions/3714971/difference-between-singleton-class-and-static-class) – sinclair
Werfen Sie einen Blick auf: http://javarevisited.blogspot.de/2013/ 03/difference-between-singleton-pattern-vs-static-class-java.html – sinclair