Pregunta

Lo siento si esto es un duplicado o demasiado elemental, pero ¿cómo hago una clase de singleton que pueda ser subclasificada?

¿Fue útil?

Solución

Steve Yegge tiene un artículo divertido sobre singletons que menciona la subclasificación en esta cita :

  

Luego está la cosa subclases.   Es casi imposible subclasificar una   Singleton, y si lo consigues, entonces   no deberías haber estado usando un   Singleton en primer lugar. Tú   No incluso quiera ir allí. He   Caminé por caminos que no me atrevo a contar.   Solo finja que no puede hacerlo, y   Te ahorrarás cantidades increíbles   del dolor.

Otros consejos

Generalmente no puedes, en ningún sentido útil. Esta sería una razón más para no usar las clases de Singleton.

En realidad, no creo que sea posible.

Usted crea un singleton de clase declarando que su (s) constructor (es) son private . Pero si luego intenta declarar una subclase de su clase singleton, el constructor de subclases no podrá ver a los constructores de la superclase ... para que no se compilen; por ejemplo

public class A () {
    private A() { }
}

public class B () {
    private B() { }
}

Tanto el compilador Sun JDK 1.6 como Eclipse Ganymede dan un error de compilación en el constructor B, en el sentido de que el constructor no-args para A no es visible.

Podrías aumentar la visibilidad de los constructores private , pero no hay nada (aparte de que tengas sentido) que impida que alguien cree múltiples instancias de él. En otras palabras, en realidad ya no es una clase individual.

EDITAR: 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 como apropiado. Pero eso NO es una clase de singleton subclasificando a otra.

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() {
  }
}

Entonces puedes simplemente hacer:

public class NewSingleton extends Singleton {
}

Pero, no podrá usar los métodos privados, por lo que si desea usar el singleton, deberá llamar a Singleton.getInstance (); para no ganar nada al extenderlo. .

Pero, no hay ninguna razón por la que no puedas hacerlo.

Ahora, si desea agregar más funciones a la clase Singleton, entonces puede usar aspectos de tipo Tip de AspectJ y simplemente inyectar nuevos métodos / propiedades en el Singleton que luego podría ser usado por el Singleton.

Singleton limita las instancias no la herencia. Bueno, como ya se ha señalado, limita la utilidad de la herencia y luego puede relajar el constructor privado al empaquetado o protegido (lo que puede argumentar disminuye la pérdida de singleton del singleton) ¿Pero cuál es el propósito?

Como ya han respondido otros, los usos de la subclasificación 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 de singleton. Esto mueve el problema una capa hacia abajo y deja más claro por qué querría hacerlo.

Para responder a su pregunta; Suponiendo que la elección de la subclase en particular que usa su aplicación se define, por ejemplo, en las propiedades del sistema, 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;
}

Descargo de responsabilidad: código no probado, agregar manejo de excepciones, etc. :-) Por cierto, asegúrate de que tu método getInstance () esté sincronizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top