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!
}
}
}
Este es de hecho un gran artículo, se habla de los problemas con ambos única y cuándo y cómo usarlo, si así lo decide. No entiendo por qué alguien le daría un voto negativo. –