He encontrado tres maneras de crear instancias de Singleton, pero tengo dudas sobre si alguna de ellas es la mejor. Los estoy usando en un entorno de subprocesos múltiples y prefiero la instanciación lenta.
Muestra 1:java singleton instanciation
private static final ClassName INSTANCE = new ClassName();
public static ClassName getInstance() {
return INSTANCE;
}
Muestra 2:
private static class SingletonHolder {
public static final ClassName INSTANCE = new ClassName();
}
public static ClassName getInstance() {
return SingletonHolder.INSTANCE;
}
Muestra 3:
private static ClassName INSTANCE;
public static synchronized ClassName getInstance()
{
if (INSTANCE == null)
INSTANCE = new ClassName();
return INSTANCE;
}
El proyecto que estoy usando ATM utiliza Muestra 2 en todas partes, pero me gusta la Muestra 3 más. También está la versión Enum, pero simplemente no la entiendo.
La pregunta aquí es - ¿en qué casos debo/no debo usar ninguna de estas variaciones? Aunque no estoy buscando explicaciones largas (hay muchos otros temas al respecto, pero todos finalmente se convierten en discusiones sobre IMO), me gustaría que fuera comprensible con pocas palabras.
¿Pero cómo lo uso? Por ejemplo, tengo esto: clase pública MyClass { public enum ClassName { INSTANCE; // pongo todos mis métodos aquí en lugar de ... } // aquí como lo haría normalmente? } Editar: maldita sea, sin formato en los comentarios ?? ¡Lo odio! – jurchiks
usted escribe sus campos únicos y métodos a continuación. Y luego acceda a ellos a través de 'ClassName.INSTANCE.doSomething (foo)' – Bozho
@jurchiks: sí. En otro lugar, debe llamar a 'ClassName.INSTANCE.methodName()' para usar los métodos singleton (o tal vez usar importaciones estáticas para deshacerse de la parte 'ClassName.INSTANCE'). – Carl