2009-04-28 8 views
25

Ich möchte ein Objekt zwischen verschiedenen Instanzen von Objekten der gleichen Klasse teilen.Was bedeuten die statischen Felder in Java genau?

Konzeptionell, während mein Programm ausgeführt wird, werden alle Objekte der Klasse A Zugriff auf das gleiche Objekt der Klasse B.

Ich habe gesehen, dass static ist systemweit und dass seine Verwendung abgeraten. Bedeutet das, dass, wenn ich ein anderes Programm habe, das auf derselben JVM läuft, die Objekte der Klasse A instanziiert, könnten diese Objekte möglicherweise auf das gleiche B-Objekt zugreifen, auf das im vorherigen Programm zugegriffen wurde?

Was sind im Allgemeinen die Fehler bei der Verwendung von statischen Feldern?

Gibt es Alternativen (die keinen großen Implementierungsaufwand erfordern)?

+1

statisch ist JVM breit, so ja, wenn Sie zwei Programme in der gleichen VM sollten sie das gleiche Objekt B –

+8

Nuno acessing werden: Class Loader-Instanz breit. –

Antwort

55

Statisch bedeutet nicht ganz "von allen Instanzen geteilt" - es bedeutet "nicht zu einer bestimmten Instanz überhaupt verwandt". Mit anderen Worten, Sie könnten das statische Feld in Klasse A erreichen, ohne jemals beliebige Instanzen zu erstellen.

Wie zum Ausführen von zwei Programmen innerhalb der gleichen JVM - es hängt wirklich davon ab, was genau Sie mit "zwei Programme ausführen" meinen. Das statische Feld ist effektiv mit dem Klassenobjekt verknüpft, das wiederum mit einem Classloader verbunden ist. Wenn also diese beiden Programme separate Classloader-Instanzen verwenden, haben Sie zwei unabhängige statische Variablen. Wenn beide den gleichen Classloader verwenden, gibt es nur einen, damit sie die Änderungen des anderen sehen.

Wie für eine Alternative - gibt es verschiedene Möglichkeiten. Eine besteht darin, den Verweis auf das "shared" -Objekt an den Konstruktor jedes Objekts zu übergeben, das Sie erstellen, das es benötigt. Es muss dann diese Referenz für später speichern. Dies kann ein wenig schmerzhaft sein und ein bisschen mehr Speicher als ein statischer Ansatz auffrischen, aber es macht eine einfache Testbarkeit möglich.

+0

danke für die alternative ... das war, was ich vorher gemacht habe, vergaß ich zu erwähnen ... aber der Konstruktor, der das freigegebene Objekt weitergeben kann, ist nicht mehr in der Bibliothek verfügbar, die ich benutze .... – LB40

2

Statische Methoden und Mitglieder werden davon abgeraten, weil sie so häufig missbraucht werden, aber das klingt wie eine Situation, in der statisch der richtige Weg ist. In Bezug auf statische Daten, die über mehrere Programme verteilt werden, ist dies nicht der Fall. Jedes Programm läuft in einer völlig separaten Umgebung.

-1

Was Sie suchen, heißt Singleton Pattern.

+2

Er gab keine Voraussetzung für die faule Instanziierung der Klasse B. Die Überapplikation von Singleton verdient meinen Zorn. – Welbog

+0

Lazy Instanziierung ist nicht der einzige Grund, Singleton zu verwenden. Es ist auch nützlich, wenn Sie eine SINGLE-Instanz einer Klasse benötigen, um sie zwischen anderen Objekten zu teilen, also den Namen. –

+3

Statisch ist ausreichend, um diese einzelne Instanz zu erhalten. Dafür ist statisch. Singleton wird speziell verwendet, wenn Sie eine einzelne Instanz haben möchten und Sie diese fälschlicherweise instanzieren müssen. Die Verwendung von Singleton, wenn dies nicht erforderlich ist, ist eine falsche Anwendung von Singleton, unterste Zeile. – Welbog

-1

Vorausgesetzt, alles ist in der gleichen Klasse Loader, warum nicht das monostate Muster verwenden, um dies zu tun?

Ihre Gemeinsam statisch in der monostate versteckt:

 

    public class Monostate { 

     private static String str = "Default"; 

     public String getString() { 
      return str; 
     } 

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

Dann sind Sie frei, so viele Instanzen des monostate zu erstellen, wie Sie wollen, aber sie haben alle die gleiche Aufgabe zugrunde, aufgrund der statischen Referenz.

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

Warum nicht? Weil es darum geht, was es tut. Es lässt das Singleton "Muster" sinnvoll erscheinen. –

+0

Alles, was ich zu tun versuchte, war, LB eine Alternative zu geben, nach der er fragte. Vielleicht ist das obige Beispiel zu einfach. Vielleicht hilft dieses Papier von Robert Martin, die Monostate und Singleton vergleicht und kontrastiert: http://www.objectoror.com/resources/articles/SingletonAndMonostate.pdf –

Verwandte Themen