Swing中静态成员的排序是否敏感?

mre*_*mre 2 java singleton swing static-members

我有这个课,比方说Foo.它extends JFrame是一个单身人士.话虽如此,它有两个静态字段:1)Foo和2 的实例a Color.

这是一段代码片段Foo:

public class Foo extends JFrame{
    private static final Color FOO_RED = new Color(155, 64, 69);
    private static final Foo INSTANCE = new Foo();

    private Foo(){
        //do stuff
    }

    public static Foo getInstance(){
        return INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有另一堂课,比方说Launcher.这是负责启动应用程序的主类.这是一个简单的类,它唯一的工作就是将构造任务委托FooEDT.

这是一段代码片段Launcher:

public class Launcher{
    public static void main(String[] args){
        SwingUtilities.invokeLater((new Runnable(){
            @Override
            public void run()
            {
                Foo.getInstance();
            }
        }));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这一切都很好.但是,当我切换Foo字段的顺序(见下文)时,使用的组件FOO_RED不再涂上这种颜色.

public class Foo extends JFrame{
    private static final Foo INSTANCE = new Foo(); //declared before Color
    private static final Color FOO_RED = new Color(155, 64, 69);

    private Foo(){
        //do stuff
    }

    public static Foo getInstance(){
        return INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,这引出了一个问题,静态字段的排序是否重要Swing

bas*_*ero 5

如前所述,静态字段的排序很重要.按照出现的顺序执行.

我会对这个例子做另一个改动.这会使静态字段顺序变得不那么重要.

更新:使用IDOH(初始化按需持有者)模式使单例线程安全.

private static class FooHolder {
    private static final Foo INSTANCE = new Foo();
}

public static Foo getInstance(){
    return FooHolder.INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)