The following example defines 2 static variables. Variable 1 (myBoolean1) is defined above the MySingletonExample (instance) variable.
Variable 2 (myBoolean2) is defined below the MySingletonExample (instance) variable.
Both variables are set to true but only 1 variable (myBoolean1) shows the proper value when displayed.
public class MySingletonExample
{
//static volatile boolean myBoolean1 = false;
static boolean myBoolean1 = false;
private static volatile MySingletonExample instance = new MySingletonExample();
//static volatile boolean myBoolean2 = false;
static boolean myBoolean2 = false;
private MySingletonExample()
{
myBoolean1 = true;
myBoolean2 = true;
}
protected static MySingletonExample getInstance()
{
System.out.println("myBoolean1 = " + myBoolean1);
System.out.println("myBoolean2 = " + myBoolean2);
return instance;
}
public static void main(String[] args)
{
MySingletonExample.getInstance();
System.out.println("---------------------------");
MySingletonExample.getInstance();
}
}
When executed, this is the output.
myBoolean1 = true
myBoolean2 = false
myBoolean1 = true
myBoolean2 = false
Why doesn't myBoolean2 return true instead of false like myBoolean1?
The only different is the placement. Is there a "rule" when working with static variables?
答案 0 :(得分:10)
myBoolean2
在构造函数中被设置为true后,由于静态变量初始化的顺序而被重新设置为false。
使用静态变量时是否有“规则”?
是的。静态单例不需要静态。只需将它们设置为常规字段即可。
private static volatile MySingletonExample instance = new MySingletonExample();
private final boolean myBoolean1;
private final boolean myBoolean2;
private MySingletonExample()
{
myBoolean1 = true;
myBoolean2 = true;
}
//...
Singleton是一种反模式,但是如果您必须使用它,implement it using an enum。
答案 1 :(得分:5)
该块中的所有静态变量均按顺序执行。因此,首先将myBoolean1
设置为false
,然后调用MySingletonExample()
构造函数,该构造函数将myBoolean1
和myBoolean2
设置为true
。最后,myBoolean2
设置为false
。
它们必须以某种确定性的顺序被调用,否则就不可能对程序的行为进行推理。