viernes, 15 de mayo de 2020

5 métodos de crear un Singleton en Java

1. Inicialización forzada (eager)

public class EagerInitializedSingleton {
    
    private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();
    
    //constructor privado para evitar el acceso directo
    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 {
    //constructor privado para evitar el acceso directo
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(){
        //do something
    }
}

No hay comentarios:

Publicar un comentario