2009-04-28 7 views
25

Me gustaría compartir un objeto entre varias instancias de objetos de la misma clase.¿Cuál es el significado exacto de los campos estáticos en Java?

Conceptualmente, mientras que mi programa se está ejecutando, todos los objetos de la clase A acceso al mismo objeto de la clase B.

he visto que es static de todo el sistema y que su uso no se recomienda. ¿Eso significa que si tengo otro programa ejecutándose en la misma JVM que ejemplifica los objetos de la clase A, estos objetos podrían potencialmente acceder al mismo objeto B que el que se accedió en el programa anterior?

¿Cuáles son generalmente los defectos detrás de usar campos estáticos?

¿Hay alguna alternativa (que no requiera un gran esfuerzo de implementación)?

+1

estática es JVM amplia de modo que sí, si tiene dos programas para la misma máquina virtual deben ser acessing el mismo objeto B –

+8

Nuno: instancia del cargador de clases de ancho. –

Respuesta

55

Static no significa "compartido por todas las instancias", significa "no relacionado con ninguna instancia en particular". En otras palabras, puede obtener el campo estático en la clase A sin crear instancias.

En cuanto a ejecutar dos programas dentro de la misma JVM, realmente depende exactamente de lo que quiere decir con "ejecutar dos programas". El campo estático es efectivamente asociado con el objeto de clase, que a su vez está asociado con un cargador de clases. Entonces, si estos dos programas usan instancias de cargador de clases separadas, tendrá dos variables estáticas independientes. Si ambos usan el mismo cargador de clases, solo habrá uno, de modo que se verán los cambios.

En cuanto a una alternativa, hay varias opciones. Una es pasar la referencia al objeto "compartido" al constructor de cada objeto que cree que lo necesite. Necesitará almacenar esa referencia para más tarde. Esto puede ser un poco molesto y absorber un poco más de memoria que un enfoque estático, pero hace que sea fácil de probar.

+0

gracias por la alternativa ... eso era lo que estaba haciendo antes, me olvidé de mencionar que ... pero el constructor que permite pasar el objeto compartido ya no está disponible en la biblioteca que uso .... – LB40

2

Los métodos y miembros estáticos no se recomiendan porque se usan con mucha frecuencia, pero esto parece una situación en la que la estática es la forma correcta de hacerlo. En cuanto a la estática compartida a través de múltiples programas, este no es el caso. Cada programa se ejecuta en un entorno completamente separado.

-1

Lo que está buscando se llama Singleton Pattern.

+2

No dio ningún requisito para la creación de instancias perezosas de clase B. La sobreaplicación de Singleton me genera ira. – Welbog

+0

La instanciación lenta no es la única razón para usar Singleton. También es útil si necesita una instancia SINGLE de una clase para compartir entre otros objetos, por lo tanto, el nombre. –

+3

Estático es suficiente para obtener esa única instancia. Para eso está la estática. Singleton se usa específicamente cuando quiere una sola instancia y necesita instalarla de forma perezosa. Usar Singleton cuando esto no es requerido es una aplicación incorrecta de Singleton, línea inferior. – Welbog

-1

Suponiendo que todo está en el mismo cargador de clase, ¿por qué no utilizar el patrón monostate para hacer esto?

Su estática compartida está escondido en el monostate:

 

    public class Monostate { 

     private static String str = "Default"; 

     public String getString() { 
      return str; 
     } 

     public void setString(String s) { 
      str = s; 
     } 
    } 

Entonces que son libres de crear tantas instancias del monostate como desee, pero todos comparten el mismo objeto subyacente debido a la referencia estática.

 
    Monostate mono = new Monostate(); 
    mono.setString("Fred"); 
    System.out.println(mono.getString()); 
+0

¿Por qué no? Porque miente sobre lo que hace. Hace que el "patrón" singleton parezca sensato. –

+0

Todo lo que estaba tratando de hacer es darle a LB una alternativa, que es lo que él pidió. Tal vez el ejemplo que di más arriba sea demasiado simplista. Quizás este artículo de Robert Martin que compara y contrasta el monostate y singleton podría ayudar: http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf –

Cuestiones relacionadas