Tengo algunas clases que se usan como Singletons. Comparten algunas funcionalidades básicas y extienden el mismo ancestro desde una biblioteca que a su vez no se usa normalmente como Singleton.¿Cómo puedo obtener un Singleton derivado de un tipo base abstracto en Java?
Si pongo la funcionalidad común en una clase base que hereda del ancestro común, obtengo una clase que no tiene sentido crear instancias, por lo que la hice abstracta. Además, dado que todas las clases se usan como Singletons, todas deben tener un método init() y un método getInstance(), que son ambos estáticos. Todos los constructores son, por supuesto, no públicos.
Ahora, ya static
es un modificador ilegal que los métodos abstractos, el siguiente no funciona, aunque esto sería exactamente lo que quiero:
class Base extends LibraryClass {
protected Base() {
// ... constructor
}
// ... common methods
// ILLEGAL!
public static abstract void init();
public static abstract <T extends Base>T getInstance();
}
class A extends Base {
private static A _INSTANCE;
private A() {
super();
}
public static void init() {
_INSTANCE = new A();
}
public static A getInstance() {
return _INSTANCE;
}
}
tan sólo pudiera dejar de lado las líneas ilegales en la base clase y listo. Pero ¿cómo puedo expresar que todos los niños de Base deben tener tener estos métodos?
¿Por qué necesitamos Singleton aunque ya tengamos Static o Final en Java? la principal renuncia/causa que nos fuerza a adoptar "Singleton" en lugar de "Static, Final"? Aunque para lograr Singleton utilizamos Static.No podría entender este acertijo. Por favor pasa tus comentarios. –
estática final es para constantes que se crean con entusiasmo. Un singleton generalmente se crea perezoso (solo cuando se necesita). Además, la estática final no permite reemplazar la "constante" con una maqueta. Por lo tanto, hacen que las pruebas sean difíciles o incluso imposibles. –
Ver http://stackoverflow.com/questions/11831/singletons-good-design-or-a-crutch –