2017-04-11 10 views
0

私はJavaを初めて使用しています。静的変数のもとで試してみる。私は、静的変数はクラスレベルにあり、クラスロード中に一度だけ初期化されると考えています。しかし、以下のプログラムをEclipseで実行すると、静的変数が再初期化されるたびに実行されます。何か不足していますか?静的変数が再初期化される

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")); 
     } 
    } 
} 

私は別のテストクラスからtestStaticメソッドを呼び出しています。

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

私はtc.testStatic()を呼び出すと仮定しています。 TestClassの静的マップには値がないため、「マップに値がありません」と表示されるはずです。しかし、次回実行した場合、else部分に移動してMapを出力する必要があります:前回の実行で値を入れているので、testvalue。しかし、tc.testStatic()を呼び出すたびに地図が再初期化されているようです。方法。

+2

しかしあなたのコードは 'testStatic'を1回だけ呼び出しますか? 2回目はいつですか? –

+2

「もう一度実行する」と言えば、プログラム全体をもう一度実行するという意味ですか?プログラムが終了すると静的変数さえ失われます。 –

+0

@MattiVirkkunen私は、1回の実行で2回の呼び出しを行う代わりに、CallTestClassを2回実行しています。 TestClassが2回ロードされるのですか? – GAK

答えて

0

staticメソッドを2回呼び出す必要があります。

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

静的変数は、実行の開始時に、一度だけ初期化され、プログラムが他の変数のように終了したときに失われます。

コードをテストする場合は、メイン内でtestStatic()メソッドを再度呼び出すと、更新された値が表示されます。

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

変更可能な静的変数はevilです!それは単体テストを非常に困難にし、すべてのコストで避けるべきです!

マップが2か所で必要な場合は、依存関係注入を使用する必要があります。

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(); 
} 

ということにも注意してくださいHashMapのでおそらくあなたは、単にnew演算子を使用してTestClassの2つのオブジェクトを作成し、それらの両方にtestStatic()を起動して見ることができます

0

並列処理のために動作しませんスレッドセーフではありません結果。コメント欄に記載されているように、アプリケーションを再実行しようとしないでください。クラスを再実行し、静的変数が前の実行で設定された値を失います。

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. 
    } 
} 

編集下記の別の答え、その非常に有効な先端で述べたように、このような変更可能な静的変数は悪であり、避けなければならない、代わりにこれらのhttps://stackoverflow.com/a/43343979/504133

に述べたように、あなたは、実行時にマップを注入することができます
関連する問題