2012-07-12 22 views
10

En la pregunta What is an efficient way to implement a singleton pattern in Java?, la respuesta con la mayoría de los upvotes dice que se debe usar un Enum para implementar un singleton.Tratando con Singletons que tienen que subclase

Eso está bien y entiendo los argumentos, respectivamente, las ventajas del idioma.

Tengo, sin embargo, un conjunto de clases que defino singleton pero que necesitan extender otras clases, esto no es posible con el enfoque enum, ya que las enumeraciones no pueden crear la subclase.

Joshua Bloch dice en sus diapositivas:

  • Pero falta una cosa, no puede extender un tipo de enumeración
    • En la mayoría de los casos, usted no debe
    • Uno uso convincente códigos de operación de casos

En la mayoría de los casos, usted no debe: ¿alguien podría explicar eso? He implementado varios servlets y extienden HttpServlet, ¿por qué estos no deberían ser simples? Solo quiero una instancia de ellos en mi aplicación.

+0

¿Podría explicar por qué quiere un servlet singleton (cuáles son las limitaciones que llevaron a esta elección)? – Romski

+0

@Romski La aplicación solo necesita una instancia de este servlet. – Mahoni

+0

enum puede implementar interfaces. Con la delegación, esto significa que solo tiene una instancia que usa la funcionalidad definida en otra clase. –

Respuesta

7

Una clase Singleton puede extender otras clases; de hecho, por defecto en Java extendería Object de todos modos. Sin embargo, a lo que Josh se refiere es que no debería extender una clase de Singleton porque una vez que la extiende, hay más de una instancia presente.

Respondiendo al comentario:

En realidad, la mejor manera de poner en práctica el Singleton es:

De Effective Java

// Singleton with static factory 
public class Elvis { 
private static final Elvis INSTANCE = new Elvis(); 
private Elvis() { ... } 
public static Elvis getInstance() { return INSTANCE; } 
public void leaveTheBuilding() { ... } 
} 

Aquí Elvis puede otorgar ninguna otra clase.

+0

¿Y cómo me ayuda esto a implementar mi servlet con el enum idioma? Una clase Singleton implementada usando el tipo enum, ** no puede ** extender otras clases. – Mahoni

+0

No, una porción en línea de "Java efectivo" dice al enfoque enum. >> Este enfoque es funcionalmente equivalente al enfoque de campo público, excepto que es más conciso, proporciona la maquinaria de serialización de forma gratuita y ofrece una garantía inquebrantable contra la creación de instancias múltiples, incluso frente a sofisticados ataques de serialización o reflexión. Si bien este enfoque aún no se ha adoptado ampliamente, un ** tipo de enumeración de elemento único es la mejor manera de implementar un singleton ** << – Mahoni

+2

Tal vez debería haber dicho, una de las mejores maneras. Pero para ti, esta sería la mejor manera porque quieres extender. – user1168577

1

Josh se refiere a extender el tipo enum, no a tener el tipo singleton extender algo más.

+0

Pero no puedo implementar mi servlet con la expresión enum singleton, ya que de esta manera no puede subclasificar 'HttpServlet':' public enum MyServlet extends HttpServlet' no está permitido. No quiero extender mi singleton, quiero que mi singleton amplíe otra clase. – Mahoni

+0

Sí, claramente. Lo que estoy diciendo es que Josh no se estaba ocupando de ese tema en esta cita;) Está claro que no se puede usar la expresión enum en este caso, entonces, ¿cuál es el problema? –

3

No debería preocuparse por la (s) instancia (s) real (es) de sus servlets - la administración del ciclo de vida es manejada por el contenedor servlet de acuerdo con el contrato de especificación de Servlet que usted acordó. Si tiene sentido implementar partes de su funcionalidad del lado del servidor como singleton, siga adelante y hágalo de la forma que desee y úselo desde su servlet.

+0

¡Eso tiene sentido! – Mahoni

+0

Esta pregunta resolvió mi problema, pero como mi pregunta era más general, decidí verificar la otra como excepción. ¡Gracias de cualquier manera! – Mahoni

Cuestiones relacionadas