以下示例定义了2个静态变量。变量1(myBoolean1)在MySingletonExample(实例)变量上方定义。
变量2(myBoolean2)在MySingletonExample(实例)变量下定义。
两个变量都设置为true,但是只有1个变量(myBoolean1)在显示时显示正确的值。
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();
}
}
Run Code Online (Sandbox Code Playgroud)
执行时,这是输出。
myBoolean1 = true
myBoolean2 =否
myBoolean1 = true
myBoolean2 =否
为什么myBoolean2不像myBoolean1一样返回true而不是false?
唯一的不同是位置。使用静态变量时是否有“规则”?
Mic*_*ael 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;
}
//...
Run Code Online (Sandbox Code Playgroud)
Singleton是一种反模式,但是如果您觉得必须使用它,请使用enum实现它。
块中的所有静态变量均按顺序执行。所以首先myBoolean1被设置为false,然后是调用MySingletonExample()构造函数,它集myBoolean1和myBoolean2对true。最后,myBoolean2设置为false。
它们必须以某种确定性的顺序被调用,否则就不可能对程序的行为进行推理。
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |