最近在学习单例模式,在写代码关于单例模数据更新的时候遇到了问题,求大师解惑!
代码是这样的:
单例类:
[java] view plaincopy
public class SingletonTest {
private static SingletonTest instance = null;
private int i= 0;
public int getNum(){
return i;
}
public void setNum(int a){
i=a;
System.out.println("Set i ----->"+i);
}
private SingletonTest() {
}
private static class HolderSingleton{
private static SingletonTest instance = new SingletonTest();//这里用不用关键字final没有什么影响,static fianl修饰的对象加强了instance只能是Singleton对
}
public static SingletonTest getInstance (){
return HolderSingleton.instance;
}
public void updateNum(){
System.out.println("i="+i);
SingletonTest shadow = new SingletonTest();
i=shadow.getNum();
}
}
测试类:
[java] view plaincopy
public class TestP {
public static void main(String[] args) {
// TODO Auto-generated method stub
SingletonTest ss = SingletonTest.getInstance();
SingletonTest ww = SingletonTest.getInstance();
ss.setNum(8);
// ss.updateNum();
ww.updateNum();
ww.updateNum();
ww.setNum(2);
ss.updateNum();
ww.updateNum();
ww.updateNum();
}
}
当需要更新的变量i 定义没有加static修饰符的时候,控制台输出结果是:
Set i ----->8
i=8
i=0
Set i ----->2
i=2
i=0
i=0
问题一:
觉得奇怪的地方就是,按道理 i 没有static修饰符, 打印出来的“i=?”应该全部都是“i=0”,为什么在设置了i 第一次跟新i的时候可以更新到。
给变量i加了static修饰符以后,数据可以更新到,没有问题,下边是加了static后的打印结果:
Set i ----->8
i=8
i=8
i=8
Set i ----->2
i=2
i=2
i=2
问题二:
所以还想问下,如果在单例模式的单例类中有需要更新的数据变量都必须用static修饰吗?