1. Inicialización forzada (eager)
public class EagerInitializedSingleton {
private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();
private EagerInitializedSingleton(){}
public static EagerInitializedSingleton getInstance(){
return instance;
}
}
Mejor evitar este tipo porque:
1) Este singleton viene instanciado cada vez que se lanza toda la aplicación
2) Si este singleton tiene acceso a muchos recursos - el tiempo de lanzar tu aplicación va ser muy largo
Utiliza mejor el método "lazy"
2. Inicialización "relajada" (lazy)
public class LazyInitializedSingleton {
private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){}
//solo devuelveme la instancia, si te pido
public static LazyInitializedSingleton getInstance(){
if(instance == null){
instance = new LazyInitializedSingleton();
}
return instance;
}
}
3. Inicialización "relajada" (lazy) con respeto a Thread
public class ThreadSafeSingleton {
private static ThreadSafeSingleton instance;
private ThreadSafeSingleton(){}
public static synchronized ThreadSafeSingleton getInstance(){
if(instance == null){
instance = new ThreadSafeSingleton();
}
return instance;
}
}
3. Inicialización "relajada" (lazy) a la manera Bill Pugh con el respeto a la memoria
public class BillPughSingleton {
private BillPughSingleton(){}
//carga mi singleton en la memoria, solo cuando te pido, porque la classe estatica interna
//no viene cargada directamente
private static class SingletonHelper{
private static final BillPughSingleton INSTANCE = new BillPughSingleton();
}
public static BillPughSingleton getInstance(){
return SingletonHelper.INSTANCE;
}
}
4. Inicialización "relajada" (lazy) con la serializacion
import java.io.Serializable;
public class SerializedSingleton implements Serializable{
private static final long serialVersionUID = -7604766932017737115L;
private SerializedSingleton(){}
private static class SingletonHelper{
private static final SerializedSingleton instance = new SerializedSingleton();
}
public static SerializedSingleton getInstance(){
return SingletonHelper.instance;
}
}
5. Inicialización de una enumeracion
public enum EnumSingleton {
INSTANCE;
public static void doSomething(){
}
}
No hay comentarios:
Publicar un comentario