静态变量重新初始化

时间:2017-04-11 10:17:42

标签: java

我是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中的静态地图没有值,因此它应该在地图中打印#34; No Values&#34;。但是如果我下次运行它应该转到else部分并且打印Map有值:testvalue因为我在前一次执行中放了值。但是,每次调用tc.testStatic()时,似乎都会重新初始化地图。方法。

4 个答案:

答案 0 :(得分:1)

静态变量仅在执行开始时初始化一次,并在程序结束时像其他变量一样丢失。

如果您想测试代码,请在main中再次调用testStatic()方法以查看更新后的值。

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

答案 1 :(得分:1)

可变的静态变量是邪恶的!它使单元测试非常困难,应该避免所有成本!

如果你需要两个地方的地图,你应该使用依赖注入。

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不是线程安全的,因此很可能无法进行并行处理

答案 2 :(得分:0)

你应该第二次调用静态方法。

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

答案 3 :(得分:0)

您可以使用TestClass运算符简单地创建new的2个对象,然后在这两个对象上调用testStatic()并查看结果。如注释部分所述,不要再尝试执行应用程序,因为它会重新使用类,因此静态变量将会丢失先前执行中设置的值。

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

编辑正如下面另一个答案所提到的,它是一个非常有效的提示,这样的可变静态变量是邪恶的,必须避免,而不是这些,你可以在运行时注入地图,如{ {3}}