2008-12-09 25 views

Respuesta

10

Lo único que parece inmediatamente evidente para mí es que una clase estática es básicamente una colección de funciones con ámbito (explícitamente evitando "métodos" aquí) y un singleton todavía es algo que puede instanciar, incluso si solo puede tener 1. 1> 0.

Puede pasar un singleton como argumento a algo que espera un objeto de cierta interfaz , no se puede pasar una clase estática en ningún lado (excepto a través de algún truco de reflexión)

2

No es exactamente equivalente. Por ejemplo, puede pasar una referencia a una instancia de singleton como argumento, que no puede hacer con una clase estática ya que no hay una instancia.

¿Qué quiere decir con "peligro"?

+0

quizás el peligro es el término equivocado. Solo me preguntaba sobre las diferencias. supongo que la herencia también es un problema ... – spender

0

No estoy seguro acerca de C#, pero en C++ un objeto estático se inicializará cuando se inicialice, y usted no tiene control directo sobre eso (especialmente en aplicaciones multiproceso). Por lo tanto, necesita una función para llamar a su objeto, no solo llamarlo directamente (a menos que desee un código no compatible)

1

Como señaló Robert Gould, pierdes el control sobre la construcción. También obtendrá problemas de construcción que son mucho más oscuros. Las clases estáticas terminan rápidamente con bloques de inicializadores estáticos. Estos bloques se llaman la primera vez que alguien hace referencia a su tipo, y este orden puede no estar tan bien definido como le gustaría pensar. Por lo tanto, el orden de ejecución de estos inicializadores estáticos puede cambiar sin que lo planee, y puede causar errores extraños.

0

Como dijo Robert anteriormente, la inicialización es una desventaja principal de una clase estática. La clase estática generalmente se inicializará perezosamente, en el último momento posible. Sin embargo, pierdes el control sobre el comportamiento exacto y los constructores estáticos son lentos.

A menudo las clases estáticas se usan para almacenar datos globales. Y los datos globales crean una dependencia implícita entre tus otros objetos/clases. Por lo tanto, debe ser caritativo al cambiar este "objeto global". Puede romper su aplicación.

+0

En realidad, a menos que haya un constructor estático (a diferencia de los inicializadores de variables estáticas), el tipo probablemente se inicializará antes de lo necesario. –

+0

Constructores estáticos "Lazy" no es un problema. Puede hacer el procedimiento de Init estático manualmente en lugar del constructor estático. – macropas

+0

Mi intención no era decir que "perezoso" es un problema. Un nombre de alias para el patrón singleton es "Inicialización diferida". Lo que a menudo veo es que Singletons y/o clases estáticas se usan como reemplazo de variables globales. – TomTom

4

En muchos sentidos, una clase estática y un singleton son similares. Una gran diferencia es que un singleton podría implementar algunas interfaces, lo que no es posible con una clase estática. Por ejemplo, Comparer<T>.Default/EqualityComparer<T>.Default proporciona (a través de la interfaz) la capacidad de utilizar el elemento en el uso de clasificación/diccionario.

También es posible (aunque complicado) utilizar un singleton con los marcos de serialización estándar. Con una clase estática, tendría que administrar cualquier persistencia de estado manualmente.

0

En el contexto de la implementación de singleton, no hay ningún peligro, creo. A menudo hago lo mismo, imlingante singletone vía clase estática. Lógicamente, la referencia del objeto no es necesaria si está solo y único.

+0

Por supuesto, si no hay necesidad en la implementación de la interfaz o la serialización estándar. Estoy de acuerdo con Marc Gravell – macropas

1

El principal peligro que puedo ver con las clases estáticas es que son mucho más difíciles de simular al escribir pruebas unitarias. Con un singleton puedes crearlo de tal forma que puedas inyectar una clase diferente en su lugar que pruebe funcionalidades específicas, con una clase estática esto no es tan fácil.