36 votos

¿Cuál es la diferencia entre una clase estática y un patrón de Singleton en Java?

¿Cómo es diferente de una clase con los campos estáticos sólo un singleton?

36voto

StriplingWarrior Puntos 56276

Casi cada vez que escribo una clase estática, termino deseando que yo había implementado como una clase no estática. Considere la posibilidad de:

  • No estáticos de la clase puede ser extendida. El polimorfismo puede ahorrar un montón de repetición.
  • No estáticos de la clase puede implementar una interfaz, que puede ser útil cuando se desea separar la implementación de la API.

Debido a estos dos puntos, no estáticos de clases hacer posible escribir más fiable de la unidad de pruebas para los elementos que dependen de ellos, entre otras cosas.

Un patrón singleton es sólo un medio paso de distancia de las clases estáticas, sin embargo. Que clase de obtener estos beneficios, pero si usted accede a ellos directamente dentro de otras clases a través de `ClassName.Instancia', está creando un obstáculo para acceder a estos beneficios. Como ph0enix señaló, es mucho mejor usar un patrón de inyección de dependencias. De esa manera, un DI marco puede decir que una clase particular es (o no es) un singleton. Usted obtiene todos los beneficios de la burla, de la unidad de pruebas, el polimorfismo, y mucha más flexibilidad.

12voto

instcode Puntos 978

Me dejo a resumir :)

La diferencia esencial es: La existencia de la forma de un singleton es un objeto estático, no lo es. Este hecho las siguientes cosas:

  • Singleton puede ser extendido. Estática no.
  • Singleton de la creación, puede no ser seguro para subprocesos si no se implementa correctamente. Estática no.
  • Singleton puede ser pasado como un objeto. Estática no.
  • Singleton puede ser el recolector de basura. Estática no.
  • Singleton es mejor que la estática de la clase!
  • Más aquí, pero no he realizado aún :)

Por último, pero no menos importante, cuando se va a implementar un singleton, por favor, considere la posibilidad de rediseñar su idea para la no utilización de este Dios de objeto (créanme, se tienden a poner todos los "interesantes" materias de esta clase) y el uso normal de una clase denominada "Contexto" o algo similar en su lugar.

5voto

JRL Puntos 36674

Un singleton puede ser inicializado perezosamente, para uno.

3voto

Numenor Puntos 1462

La diferencia es independiente del idioma. Singleton es por definición: "Asegúrese de que una clase tiene sólo una instancia y proporciona un punto global de acceso a lo" una clase llena de campos estáticos no es igual que el singleton pero tal vez en su escenario de uso proporcionan la misma funcionalidad. Pero como JRL dijo perezoso iniciación es una de las diferencias.

2voto

Peter Tillemans Puntos 20129

Por lo menos usted puede más fácilmente reemplazarlo por una mofa o un trozo para pruebas unitarias. Pero yo no soy un gran fan de singletons exactamente la razón que usted está describiendo: son variables globales en disfraz.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X