Ich habe drei Möglichkeiten zur Instantiierung eines Singleton gefunden, aber ich habe Zweifel, ob einer von ihnen der beste ist. Ich benutze sie in einer Multi-Thread-Umgebung und bevorzuge faule Instanziierung.
Probe 1:Java Singleton Instanziierung
private static final ClassName INSTANCE = new ClassName();
public static ClassName getInstance() {
return INSTANCE;
}
Probe 2:
private static class SingletonHolder {
public static final ClassName INSTANCE = new ClassName();
}
public static ClassName getInstance() {
return SingletonHolder.INSTANCE;
}
Probe 3:
private static ClassName INSTANCE;
public static synchronized ClassName getInstance()
{
if (INSTANCE == null)
INSTANCE = new ClassName();
return INSTANCE;
}
Das Projekt I ATM bin mit verwendet Probe 2 überall, aber ich mag Probe 3 mehr. Es gibt auch die Enum-Version, aber ich verstehe es einfach nicht.
Die Frage hier ist - in welchen Fällen sollte/sollte ich keine dieser Variationen verwenden? Ich suche jedoch keine langen Erklärungen (es gibt viele andere Themen dazu, aber alle werden schließlich dazu gebracht, IMO zu streiten), ich möchte, dass es mit wenigen Worten verständlich ist.
Aber wie benutze ich es? Zum Beispiel habe ich folgendes: öffentliche Klasse MyClass { öffentliche enum Klassenname { INSTANCE; // setze ich alle meine Methoden hier anstelle von ... } // hier, wie ich normalerweise würde? } Edit: verdammt, keine Formatierung Kommentare? Hasse es! – jurchiks
schreiben Sie Ihre Singleton-Felder und Methoden unten. Und dann Zugriff auf sie über 'ClassName.INSTANCE.doSomething (foo)' – Bozho
@ Jurchiks: ja. An anderer Stelle würden Sie 'ClassName.INSTANCE.methodName()' aufrufen, um die Singleton-Methoden zu verwenden (oder vielleicht statischen Import verwenden, um den 'ClassName.INSTANCE.') Teil zu entfernen. – Carl