Java:为什么放置静态变量很重要?

Unh*_*ion 1 java static

以下示例定义了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实现它


dan*_*368 5

块中的所有静态变量均按顺序执行。所以首先myBoolean1被设置为false,然后是调用MySingletonExample()构造函数,它集myBoolean1myBoolean2true。最后,myBoolean2设置为false

它们必须以某种确定性的顺序被调用,否则就不可能对程序的行为进行推理。