Disculpa si es un duplicado o si es demasiado elemental, pero ¿cómo puedo crear una clase singleton que pueda ser subclasificada?¿Cómo hago que otras clases se derivan de una clase singleton?
Respuesta
Steve Yegge tiene una divertida article acerca únicos que menciona la subclasificación en esta cita:
Luego está el asunto de subclases. Es casi imposible crear una subclase de Singleton , y si la administra, entonces no debería haber estado utilizando un Singleton en primer lugar. Usted no incluso quiere ir allí. Tengo caminos caminados que no me atrevo a contar. Solo pretendo que no puede hacerlo, y se ahorrará asombrosas cantidades de dolor.
¿Entonces la respuesta es "NO"? – unj2
Si quieres leerlo de esa manera, entonces sí, es no. O puede leerlo y ver que la respuesta es sí, pero aún así no debe intentarlo, y es posible que desee evaluar por qué está utilizando un singleton en primer lugar. –
Por lo general, no puede, en ningún sentido útil. Esta sería una razón más para no usar las clases de Singleton.
Si ha definido su Singleton como:
public class Singleton {
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
private Singleton() {
}
}
continuación, sólo puede hacer:
public class NewSingleton extends Singleton {
}
Pero, usted no será capaz de utilizar los métodos privados por lo que si desea use el singleton, igual deberá llamar al Singleton.getInstance();
para que no gane nada extendiéndolo.
Pero no hay ninguna razón por la que no pueda hacerlo.
Ahora, si desea agregar más funciones a la clase Singleton, puede utilizar aspectos entre tipos de AspectJ e inyectar nuevos métodos/propiedades en Singleton que luego podría ser utilizado por Singleton.
Singleton limita las instancias no la herencia. Bueno, como ya se ha señalado, limita la utilidad de la herencia y luego puedes relajar el constructor privado para empaquetarlo o protegerlo (lo que puedes argumentar disminuye la soltería del singleton) ¿Pero cuál es el propósito?
En realidad, no creo que sea posible.
Usted hace un singleton de clase declarando que su constructor (es) es private
. Pero si luego intentas declarar una subclase de tu clase singleton, el constructor de subclases no podrá ver los constructores de la superclase ... por lo que no compilarán; p.ej.
public class A() {
private A() { }
}
public class B() {
private B() { }
}
Tanto el Sun JDK 1.6 y Eclipse Ganymede compilador dará un error de compilación en el constructor B, en el sentido de que el constructor sin argumentos para A no es visible.
Puede aumentar la visibilidad de los constructores private
, pero luego no hay nada (aparte del buen sentido) que impida que alguien cree varias instancias de la misma. En otras palabras, ya no es una clase singleton.
EDIT: Supongo que una alternativa kosher sería definir un árbol de una o más clases abstractas (no singleton) con los métodos/miembros que desea que sean comunes, y luego definir múltiples clases singleton como clases de hoja según sea apropiado. Pero esa NO es una clase singleton que subclasifique a otra.
Como otros ya han respondido, los usos de subclases de singleton son pequeños. Si necesita un patrón de estrategia en el contexto de un singleton, puede definir una interfaz y delegar en una implementación de esa interfaz en la instancia singleton. Esto mueve el problema una capa hacia abajo y deja más claro por qué querrías hacerlo.
Para responder a su pregunta; suponiendo que la elección de la subclase particular, la aplicación utiliza se define en por ejemplo las propiedades del sistema, se puede hacer algo como:
public static synchronised Singleton getInstance() {
if (instance == null) {
String clsName = System.getProperties().getProperty("singleton.class");
if (className == null || 0 == clasName.length()) {
instance = new Singleton();
} else {
Class cls = Class.forName(clsName);
instance = (Singleton) cls.newInstance();
}
}
return instance;
}
Exención de responsabilidad: Código no probado, agregar el manejo de excepciones, etc. :-) Por cierto, asegúrese su método getInstance()
está sincronizado.
- 1. ¿Cómo serializar una clase que contiene objetos de otras clases (serialización recursiva?)
- 2. ¿Cómo se elimina una clase que coincide con un patrón del atributo de clase, pero conserva las otras clases?
- 3. Clases singleton
- 4. evitar que otras clases de alterar una lista en una clase
- 5. clase Singleton en java
- 6. ¿Cómo hago que una clase tenga prioridad sobre una identificación?
- 7. clase estática vs clase singleton
- 8. Singleton clase en Flex
- 9. Force Singleton Pattern en una clase que implementa una interfaz
- 10. Usando cadenas de otras clases C#
- 11. clases singleton/estáticas para servicios
- 12. clase estática y singleton
- 13. C++: ¿Declarar una clase global y acceder a ella desde otras clases?
- 14. clases de decisiones públicas a otras clases en C++
- 15. Creando una clase singleton con dispatch_once para clase hiearchy
- 16. Singleton - ¿Por qué usar clases?
- 17. Clases de Singleton y Static Utility
- 18. ¿Cómo hago una GUI?
- 19. ¿Cómo marco una clase como singleton en UML?
- 20. Hibernate EntityManager, ¿se supone que debe usarse como singleton?
- 21. PHP OOP: cómo usar una clase MySQL genérica en otras clases
- 22. Establecer @property de una clase Singleton
- 23. ¿Cómo organizo clases de C# que heredan unas de otras, pero también tienen propiedades que heredan unas de otras?
- 24. Python usando métodos de otras clases
- 25. La extensión de una clase Singleton
- 26. Usar correctamente las clases en otras clases en php?
- 27. Cómo crear una clase Singleton de proceso cruzado en Java
- 28. ¿Está extendiendo una clase singleton incorrecta?
- 29. Extender la clase Singleton abstracta
- 30. ¿Cómo hago que wget se silencie correctamente?
¿Por qué el voto a favor? Esto parece una pregunta legítima? –
Tal vez el downvoter recientemente cenó y actualmente se siente saciado, por lo que la referencia "alimentaria" se sintió poco atractiva ...? –
Lo siento @Alex. Arruine tu broma justo cuando la publicaste. –