2011-05-23 24 views
5

Sé que este tema ha sido discutido y asesinado una y otra vez, pero todavía tenía una duda con la que esperaba que alguien me pudiera ayudar o guiarme a una publicación preexistente en SO.clase estática vs clase singleton

En C tradicional, las variables estáticas se almacenan en segmentos de datos y las variables locales se almacenan en la pila. Lo que supondría haría que las variables estáticas fueran más caras de almacenar y mantener en comparación con las variables locales. ¿Derecha?

Al tratar de entender en términos de Java o C#, ¿sería esto una desventaja para las clases estáticas en comparación con la clase singleton? Dado que toda la clase se carga en la memoria antes de la inicialización de la clase, no veo cómo puede ser una ventaja a menos que tengamos funciones pequeñas en línea.

Me encantan las clases de Singleton, y odiaría ver que se convierta en un antipatrón, todavía estoy buscando todas las ventajas que conlleva ... y luego me desahogo el argumento de la seguridad de hilos entre otros.

-Ivar

Respuesta

7

A diferencia de C, la palabra clave static en la clase de Java definición simplemente significa, Esta es solo una clase normal como cualquier otra clase, pero sucede que se declara dentro de otra clase para organizar el código.En otras palabras, no hay ninguna diferencia de comportamiento alguna entre el 2 vías siguiente de la declaración *:
una)

class SomeOtherClass { 
    static class Me { 
     // If you "upgrade" me to a top-level class.... 
    } 
} 

b)

class Me { 
    // I won't behave any different.... 
} 

Las definiciones de clases se cargan en la memoria cuando se utiliza

la clase por primera vez, y esto es cierto para ambas clases "estática" y "no estática". Tampoco hay diferencia en cómo se usará la memoria. En las JVM antiguas, los objetos siempre se almacenaban en montón. Modern JVMs do asignar objetos en la pila cuando eso es posible y beneficioso, pero esta optimización es transparente para el codificador (no es posible influir en este comportamiento a través del código), y el uso de la palabra clave static no tiene ningún efecto sobre esto comportamiento.

Ahora, de vuelta a su pregunta original, como ya hemos visto que realmente no podemos comparar las clases estáticas y Singleton en Java, ya que son completamente diferente concepto en Java (tampoco estoy seguro de cómo se compararían clases estáticas con Singleton, pero me centraré en Java en esta respuesta). La palabra clave static en Java está sobrecargada y tiene muchos significados, por lo que puede ser confusa.

¿Es Singleton automáticamente un "antipatrón"? No lo creo. Abuso de Singleton es, pero el patrón de Singleton en sí puede tener muchos buenos usos. Simplemente se abusó mucho. Si tiene una razón legítima para usar el patrón de Singleton, no hay nada de malo en usarlo.



* Nota: ¿Por qué escribir static en absoluto, usted puede preguntar. Resulta que las clases anidadas "no estáticas" tienen su propia implicación de administración de memoria algo complicada, y su uso generalmente se desaconseja a menos que tenga una buena razón (los pls se refieren a otras preguntas para más información).

class SomeOtherClass { 
    Stuff stuff; 
    class Me { 
     void method(){ 
      // I can access the instance variables of the outer instance 
      // like this: 
      System.out.println(SomeOtherClass.this.stuff); 
      // Just avoid using a non-static nested class unless you 
      // understand what its use is! 
     } 
    } 
} 
3

clase Singleton es esencialmente una clase de nivel superior regular con un constructor private, para garantizar su sencillez. La clase Singleton en sí misma proporciona una forma de capturar su instancia. Las clases de Singleton no son muy fáciles de probar, por lo tanto, tendemos a seguir con la idea de Just Create Once.

static clase es esencialmente una clase anidada. Una clase anidada es esencialmente una clase de nivel externo que está anidada en otra clase solo por conveniencia de empaquetado. Una clase de nivel superior no se puede declarar como static, al menos en Java; debe intentarlo usted mismo.

Sería este des-ventaja para clases estáticas en comparación con Singleton clase?

Su pregunta se convirtió en inválida ahora, de acuerdo con la explicación anterior. Además, una clase static (por supuesto anidada) también puede ser un singleton.

Más información:

0

Las diferencias entre uno y otro es la gestión de memoria, si su aplicación tendrá que crear una instancia de un montón de cosas, que quemará la memoria como un encanto convirtiéndose en un problema de memoria, rendimiento y otras cosas ... esto podría ayudar ...

http://butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf

Cuestiones relacionadas