我是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()时,似乎都会重新初始化地图。方法。
答案 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}}