Parafraseando a Groucho Marx: éstos son mis títulos de post. Si a usted no le gustan, tengo otros 😉
Warning: post muy técnico.
Si programas en un lenguaje orientado a objetos, es probable que te hayas encontrado a menudo con el patrón singleton. Últimamente me he encontrado tecleando las líneas de este patrón en Java una y otra vez, con lo que se me ha encendido la bombilla de la pereza: «y ésto… ¿no lo podré automatizar?» Por supuesto. En Eclipse es sencillo:
Window->Preferences->Java->Editor->Templates. Click en New e insertar el siguiente código. Darle un nombre («singleton» podría ser una decisión acertada 😉 . Cuando quieras usar el patrón en tus clases Java, escribe «singleton» y pulsa Ctrl+Espacio. ¡Magia!
private static ${enclosing_type} instance;
private ${enclosing_type}(){}
public static ${enclosing_type} getInstance(){
if(null == instance){
instance = new ${enclosing_type}();
}
return instance;
}
Nota: ojito, que esta forma de implementación del patrón parece sufrir una condición de carrera en el bloque if … una posible solución sería inicializar la referencia estática en la propia sección de declaraciones.
Referente a la condición de carrera… También podrías sincronizar la llamada, no? (syncronized)…
Al igual me equivoco…
Sí, pero tras darle varias vueltas, yo creo que es más eficiente inicializar aquí (ahorrándome el synchronized)
private static Clase instance = new Clase();
Tal y como se explica aquí:
http://forum.java.sun.com/thread.jspa?threadID=606978&messageID=3313598#3302883
Dos cosas:
1) si no voy a usar más de un thread, no parece que importe si uso la primera opción (del template) o ésta otra que describo en este comentario.
2) habría que pensar cómo tratar el caso en el que la instanciación «= new Clase()» pudiera lanzar una excepción 🙂