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

| 我有这个课,比方说,
Foo
。它是
extends JFrame
,是一个单例。话虽这么说,它有两个静态字段:1)ѭ0的实例和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;
    }
}
我还有另外一堂课,比如
Launcher
。这是负责启动应用程序的主要类。这是一个简单的类,因为它的唯一工作就是将构造“ 0”的任务委托给“ 8”。 这是
Launcher
的代码段:
public class Launcher{
    public static void main(String[] args){
        SwingUtilities.invokeLater((new Runnable(){
            @Override
            public void run()
            {
                Foo.getInstance();
            }
        }));
    }
}
现在,一切正常。但是,当我切换
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;
    }
}
因此,这引出了一个问题,当涉及到
Swing
时,静态字段的排序是否重要?     
已邀请:
        如前所述,静态字段的顺序确实很重要。按它们出现的顺序执行。 我将对该示例进行其他更改。这将使您的静态字段顺序不那么重要。 更新:使用IDOH(按需初始化持有人)模式使单例线程安全。
private static class FooHolder {
    private static final Foo INSTANCE = new Foo();
}

public static Foo getInstance(){
    return FooHolder.INSTANCE;
}
    
        是。对于任何
static
字段/块,排序都很重要。 编辑: 首先,将静态字段设置为其默认值(因此
FOO_RED
null
),然后按照出现的顺序初始化静态字段。因此可以在初始化之前观察
FOO_RED
字段。     
        顺序对于静态字段确实很重要,因为它们是从上到下初始化的。在您的情况下,切换顺序会使Foo()构造函数在初始化FOO_RED之前被调用。这样,在构造函数中使用的FOO_RED将为18。这是合法的,尽管显然对希望使用FOO_RED的任何控件都没有用。     

要回复问题请先登录注册