Pregunta

Si una clase implementa un patrón singleton, ¿deberían declararse todas las variables estáticas?

¿Hay alguna razón por la que no deberían ser declarados estáticos? ¿Hace alguna diferencia?

¿Fue útil?

Solución

No. El patrón Singleton solo significa que una sola instancia es la única instancia: no significa "hacer que todo sea accesible estáticamente".

El patrón Singleton le brinda todos los beneficios de una "instancia única", sin sacrificar la capacidad de probar y refactorizar su código.

Editar:

El punto que estoy tratando de hacer es que existe una diferencia entre cómo se debe consumir la funcionalidad (que depende del contexto) y cómo se debe inicializar la funcionalidad.

Puede ser apropiado que en la mayoría de los casos su objeto solo tenga una sola instancia (por ejemplo, en su sistema de producción final). Pero también hay otros contextos (como las pruebas) que se hacen mucho más difíciles si lo obliga a ser la única opción.

Además, hacer algo estático tiene implicaciones más significativas que solo "solo debería ser accesible una instancia de mi clase", lo que generalmente es la intención.

Además, en el software en el que he trabajado, la inicialización y el ciclo de vida de los objetos a menudo son controlados por otra persona (estoy hablando de DI aquí), y hacer algo estático realmente no ayuda aquí.

Otros consejos

En un patrón de singleton común, lo haces no Usa las estadísticas. Codifica la clase para usar campos ordinarios, inicializa en el constructor y luego organiza ejecutar nuevo MyClass() Una vez, almacene los resultados en algún lugar estático.

No, lo único que generalmente es estático es la referencia al singleton (y hay otras formas de almacenar esa referencia también, como JNDI o contenedores de inyección de dependencia).

La razón para no declarar a los campos como estáticos (aunque en un patrón singleton necesitará solo una instancia de ellos) es que esto le brinda la flexibilidad de crear otra instancia ligeramente diferente de la clase normalmente Singleton. Es posible que desee hacerlo en situaciones especiales, como para las pruebas.

Incluso si no (crees que necesitas esa flexibilidad, no hay razón para renunciar. Declarar un campo como estática no tiene beneficios que perdería.

pueden Haz esto (no necesariamente debería). Pero, incluso para un singleton, tiendo a hacer todas las variables a nivel de objeto en lugar de a nivel de clase porque:

  • En algún momento decidir que un singleton fue una mala idea para esa clase y tener variables a nivel de clase hará que la refactorización sea más difícil.
  • Con las variables a nivel de objeto, solo surgen cuando instancías el singleton. Con el nivel de clase, siempre están ahí.

En pocas palabras: nunca he podido pensar en una desventaja de tenerlos como nivel de objeto, así que así es como lo hago. Las dos desventajas anteriores al nivel de clase pueden ser minúsculas, pero están allí. Probablemente se reduce a la preferencia personal al final.

Puede leer sobre cómo (una forma posible) para crear un singleton en Java aquí:

Patrones de diseño de Wikibooks: Java Singleton

Básicamente, no necesita (ni debe) hacer todas las cosas en la clase estática solo porque tiene la intención de usar algo como singleton. Hay varias razones

  • Verifique las respuestas de Paxdiablo y Thilo
  • Tampoco olvide hacerlo todo estático no lo convierte en un singleton, también necesitaría eliminar cada constructor (y hacer que el constructor predeterminado sea privado)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top