2009-10-22 5 views
5

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?

+1

¿Por qué el voto a favor? Esto parece una pregunta legítima? –

+1

Tal vez el downvoter recientemente cenó y actualmente se siente saciado, por lo que la referencia "alimentaria" se sintió poco atractiva ...? –

+0

Lo siento @Alex. Arruine tu broma justo cuando la publicaste. –

Respuesta

11

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.

+0

¿Entonces la respuesta es "NO"? – unj2

+1

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. –

5

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.

1

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.

1

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?

3

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.

+0

Compila ... Soy lo suficientemente idiota como para ceder mi tiempo creando 2 clases de prueba. Entonces lo hace (al menos - no hay constructores de argumentos) – Bostone

+0

Oh bueyes - 'desperdicio' que es – Bostone

+0

¿Qué tiene que ver el ganado con esto ??? :-) –

0

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.

Cuestiones relacionadas