2013-02-22 5 views
14

Ich habe Singleton in vielerlei Hinsicht je nach der Bedingung wie flüchtige/faule Singleton, eifrige Singleton, normale Singleton und durch Enum auch entwickelt, aber speziell möchte ich über statische Halter Muster Singleton unten gezeigt wissen.In Bezug auf statische Halter Singleton Muster

public static class Singleton { 
    private static class InstanceHolder { 
     public static Singleton instance = new Singleton(); 
    } 

    private Singleton(){} 

    public static Singleton getInstance() { 
     return InstanceHolder.instance; 
    } 
} 

Bitte geben Sie an, unter welchen Bedingungen es vorteilhaft ist und welche Vorteile es hat.

+0

Viele Fragen dazu bereits, aber ein guter Grund für die Verwendung von Singletons ist die Schwierigkeit zu testen. – vikingsteve

+3

Ihre Implementierung ist falsch. Die Instanz sollte endgültig sein. – jdb

+3

Ja, tatsächlich kann 'instance' tatsächlich' private static final' sein. – vikingsteve

Antwort

2

Dies ist eine Möglichkeit, einen threadsicheren faulen Singleton zu erstellen, indem die Art und Weise genutzt wird, wie JVM Klassen lädt. In Blochs Effektivem Java-Buch erfahren Sie mehr darüber, warum und wie Sie es richtig implementieren.

Denken Sie daran, dass aus Sicht der testable code Singletons (und globalen Zustand im Allgemeinen) sind nicht vorteilhaft und sollte vermieden werden.

41

Dieses Muster ist für mindestens 3 Gründen vorteilhaft:

  1. Statische Fabrik
  2. faule Initialisierung
  3. Thema sicher

Die JVM aufschiebt die InstanceHolder Klasse initialisiert, bis es tatsächlich verwendet wird, und da das Singleton mit einem statischen Initialisierer initialisiert wird, ist keine zusätzliche Synchronisation erforderlich. Der erste Aufruf von getInstance von beliebigem Thread bewirkt, dass InstanceHolder geladen und initialisiert wird. Zu diesem Zeitpunkt erfolgt die Initialisierung des Singleton über den statischen Initialisierer.

Das statische Halterungsmuster wird auch als der intelligenteste Ersatz für Double-Check-Locking-Antipattern angesehen.

+4

+1 Für die tatsächliche Beantwortung der OPs Frage "Was sind die Vorteile". –