Showing posts with label singleton. Show all posts
Showing posts with label singleton. Show all posts

Singleton: Mejorado

El Singleton, que presenté en mi entrada anterior es la implementación más común de un Singleton, sin embargo aun tiene algunos defectos, entre ellos está es que si esa clase la hacemos serializable, en cada ejecución se crearían diferentes instancias del singleton y tendríamos que crear un método para proteger esto. Y también tenemos el problema de que se puede accesar al constructor privado utilizando el API Reflection. Entonces aquí tenemos una forma más elegante de crear un Singleton:







public enum Singleton {

INSTANCE;

public void doSomething() {

}

}





Y luego cuando lo quisieramos usar, lo único que tendríamos que hacer sería esto:




public class Principal {

public static void main(String[] args) {
Singleton.INSTANCE.doSomething();
}

}




Y con eso tenemos una mejor y más sencilla implementación de un Singleton que nos garantiza que siempre será una única instancia.
SaludoSS!



Referencias:

Blooch, J. Effective Java 2nd Edition

Singleton en Java

Bien, un Singleton en términos muy generales es un objeto del cuál sólo podremos tener una instancia (es decir sólo podemos construir un objeto de esa clase durante la ejecución del programa). Programar un Singleton en Java es muy sencillo, lo único que tenemos que hacer es evitar que otras clases tengan acceso al constructor de mi clase singleton, y ¿cómo se hace eso? Pues sólo tenemos que hacer el constructor Privado, y luego hacemos un método que nos regrese la única Instancia creada.



public class Singleton {


//LA UNICA INSTANCIA QUE SERÁ CREADA
//LA CREAMOS DESDE QUE SE CARGUE LA CLASE
private static Singleton instancia = new Singleton();


//HACEMOS EL CONSTRUCTOR PRIVADO
//PARA QUE SÓLO PUEDA INSTANCIA OBJETOS DESDE LA MISMA CLASE
private Singleton() {
}


//MÉTODO PARA OBTENER LA INSTANCIA
public Singleton getInstance() {
return instancia;
}



}





En este ejemplo la instancia se crea, desde que se crea la clase, pero a veces es mejor crear la instancia hasta que se pide, entonces el código quedaría algo así:


public class Singleton {



//CREAMOS LA REFERENCIA
//AUNQUE AL INICIO APUNTA A NULL
private static Singleton instancia ;


//HACEMOS EL CONSTRUCTOR PRIVADO
//PARA QUE SÓLO PUEDA INSTANCIA OBJETOS DESDE LA MISMA CLASE
private Singleton() {
}


//MÉTODO PARA OBTENER LA INSTANCIA
public Singleton getInstance() {
if(instancia==null) //SI ES NULL
instancia = new Singleton(); //LO INSTANCIAMOS
return instancia;
}



}



Y con esto creamos nuestra clase Singleton, Luego ya le podemos programar métodos adicionales que son los servicios que va a ofrecer.

Saludos