miércoles, 20 de diciembre de 2006

Singleton

public class ClassicSingleton {
private static ClassicSingleton instance = null;
protected ClassicSingleton() {
// Exists only to defeat instantiation.
}
public static ClassicSingleton getInstance() {
if(instance == null) {
instance = new ClassicSingleton();
}
return instance;
}
}


Notas:

Si dejamos el constructor protected, clases en el mismo paquete podrán crear más de una instancia (sin necesidad de extender al Singleton). Podemos crear un paquete explícito para el Singleton o podemos hacer el constructor private. Si usamos la segunda opción, no se podrán hacer subclases del Singleton; en ese caso es mejor declarar explícitamente que el Singleton es final para temas de optimización en compilación.

Este Singleton no es thread-safe.

¿Opciones para hacerlo thread-safe?

1) Opción conservadora: sincronizar el método getInstance(). Hacer esto es caro.

public synchronized static Singleton getInstance() {
if(singleton == null) {
simulateRandomActivity();
singleton = new Singleton();
}
logger.info("created singleton: " + singleton);
return singleton;
}



2) Opción radical: no permite cambiar en un futuro el número de instancias del Singleton más allá de uno.

public class Singleton {
public final static Singleton INSTANCE = new Singleton();
private Singleton() {
// Exists only to defeat instantiation.
}
}

No hay comentarios: