2017-04-11 4 views
0

Ich bin neu in Java. Versuche unter statischen Variablen zu sein. Ich glaube, dass statische Variablen auf Klassenebene sind und nur einmal während des Klassenladens initialisiert werden. Allerdings, wenn ich das folgende Programm durch Eclipse ausführen, jedes Mal, wenn die statische Variable neu initialisiert wird. Fehle ich etwas?statische Variable wird reinitialisiert

public class TestClass 
{ 
    private static Map<String,String> map= new HashMap<>(); 

    public void testStatic() 
    { 
     if(map.get("testkey")==null) 
     { 
      System.out.println("No values in the Map"); 
      map.put("testkey","testvalue"); 
     } 
     else 
     { 
      System.out.println("Map has value:"+ map.get("testkey")); 
     } 
    } 
} 

Ich rufe die testStatic-Methode von einer anderen Testklasse.

public class CallTestClass 
{ 
    public static void main(String... args) 
    { 
     TestClass tc= new TestClass(); 
     tc.testStatic(); 
    } 
} 

Ich gehe davon aus, dass, wenn ich die tc.testStatic nennen(); Zum ersten Mal hat die statische Map in TestClass keine Werte, daher sollte "No Values ​​in the map" gedruckt werden. Aber wenn ich das nächste Mal ausführe, sollte es zum else Teil gehen und print Map hat value: testvalue, da ich Wert in die vorherige Ausführung setze. Es scheint jedoch, dass die Karte jedes Mal neu initialisiert wird, wenn ich tc.testStatic() aufrufe; Methode.

+2

Aber Ihr Code ruft nur 'testStatic' einmal auf? Wann ist das zweite Mal? –

+2

Wenn Sie "ein zweites Mal ausführen" sagen, meinen Sie, dass Sie das gesamte Programm erneut ausführen? Sogar statische Variablen gehen verloren, wenn ein Programm endet. –

+0

@MattiVirkkunen Ich führe die CallTestClass zweimal statt zwei Anrufe im Einzellauf. Wird die TestClass zweimal geladen? – GAK

Antwort

0

Sie sollten zum zweiten Mal statische Methode aufrufen.

public class CallTestClass{ 
    public static void main(String... args) 
    { 
    TestClass tc= new TestClass(); 
    tc.testStatic(); // "No values in the Map" 
    tc.testStatic(); // Map has value:testvalue 
    } 
    } 
1

Statische Variablen werden nur einmal, zu Beginn der Ausführung initialisiert und gehen verloren, wenn ein Programm wie andere Variablen endet.

Wenn Sie Ihren Code testen möchten, rufen Sie die Methode testStatic() erneut in main auf, um den aktualisierten Wert zu sehen.

public static void main(String... args) 
{ 
    TestClass tc= new TestClass(); 
    tc.testStatic(); 
    tc.testStatic(); 
} 
1

Veränderbare statische Variablen sind böse !!! Es macht Unit-Tests sehr schwierig und sollte zu allen Kosten vermieden werden !!

Wenn Sie die Karte an zwei Stellen benötigen, sollten Sie die Abhängigkeitsinjektion verwenden.

public static void main(String... args) { 
    Map<String, String> map = new HashMap<>(): 
    map.put("testkey", "testvalue"); 
    TestClass1 tc1 = new TestClass1(map); 
    TestClass2 tc2 = new TestClass2(map); 
    tc1.doStuff(); 
    tc2.doStuff(); 
} 

Beachten Sie auch, dass HashMap ist nicht Thread-sicher so wird wahrscheinlich nicht für die parallele Verarbeitung arbeiten

0

Sie einfach 2 Objekte von TestClassnew Operator erstellen und dann aufrufen testStatic() auf jedem von ihnen und sehen die Ergebnisse. Wie im Abschnitt Kommentare erwähnt, versuchen Sie nicht, die Anwendung erneut auszuführen, da dadurch die Klassen geladen werden und daher statische Variablen die in der vorherigen Ausführung festgelegten Werte verlieren.

public class CallTestClass { 
    public static void main(String... args){ 
     TestClass object1= new TestClass(); 
     object1.testStatic(); //this will execute the code inside the if condition, hence map will have an entry for the key "testkey" 

     TestClass object2= new TestClass(); 
     object2.testStatic(); //this will execute the else part. 
     //Even though object is new but as map is defined as 
     // static hence the state set is retained. 
    } 
} 

bearbeiten Wie unten von einer anderen Antwort erwähnt, es ist eine sehr gültige Spitze, wie wandelbar statische Variablen sind böse und muss vermieden werden, statt diese können Sie die Karte während der Laufzeit injizieren, wie in https://stackoverflow.com/a/43343979/504133

erwähnt
Verwandte Themen