Dies ist ein Hack mißbrauchen die Tatsache, dass Properties
erstreckt Map
, eine alte bedauernswerte Entscheidung
012.
public final class JvmWideSingleton
{
private static final JvmWideSingleton INSTANCE;
static {
// There should be just one system class loader object in the whole JVM.
synchronized(ClassLoader.getSystemClassLoader()) {
Properties sysProps = System.getProperties();
// The key is a String, because the .class object would be different across classloaders.
JvmWideSingleton singleton = (JvmWideSingleton) sysProps.get(JvmWideSingleton.class.getName());
// Some other class loader loaded JvmWideSingleton earlier.
if (singleton != null) {
INSTANCE = singleton;
}
else {
// Otherwise this classloader is the first one, let's create a singleton.
// Make sure not to do any locking within this.
INSTANCE = new JvmWideSingleton();
System.getProperties().put(JvmWideSingleton.class.getName(), INSTANCE);
}
}
}
public static JvmWideSingleton getSingleton() {
return INSTANCE;
}
}
Dies könnte parametrisiert werden, aber dann wäre die Initialisierung faul und gehen Sie zu getSingleton()
.
Properties
ist Hashtable
-basiert, so ist es Thread sicher (gemäß der Dokumentation). So könnte man props.computeIfAbsent()
verwenden. Aber ich mag es so mehr.
Auch hier lesen: Scope of the Java System Properties
Ich schrieb es einfach und es gibt eine Chance, etwas, das ich dies von der Arbeit das würde verhindern, übersah es.
Wenn Sie wirklich ein Singleton-Design-Muster erreichen wollen, dann folgen Sie [enum type] (http://en.wikipedia.org/wiki/Singleton_pattern#The_Enum_way) in Java - "* ein Single-Element-Enum-Typ ist die beste Möglichkeit, ein Singleton zu implementieren * " – Lion
das Enum-Muster würde das Vorhandensein einer Instanz pro Klassenlader nicht verhindern, oder? – keuleJ
Über Singletons: http://weblogs.java.net/blog/kirillcool/archive/2005/08/how_single_is_y.html – keuleJ