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

时间:2011-05-27 14:20:37

标签: java swing singleton 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;
    }
}

我还有另一节课,比方说Launcher。这是负责启动应用程序的主类。这是一个简单的课程,唯一的工作就是将构建Foo的任务委托给EDT

以下是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;
    }
}

所以,这就引出了一个问题,<{> 1}} 静态字段的顺序是否重要?

3 个答案:

答案 0 :(得分:5)

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

我会对此示例进行另一项更改。这会使静态字段顺序变得不那么重要。

更新:使用IDOH (Initialization on Demand Holder)模式使单例线程安全。

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

public static Foo getInstance(){
    return FooHolder.INSTANCE;
}

答案 1 :(得分:4)

是。订购任何static字段/块的事项。


修改: 首先,将静态字段设置为其默认值(因此FOO_REDnull)。然后静态字段按其显示的顺序初始化。因此可以在初始化之前观察FOO_RED字段。

答案 2 :(得分:1)

排序对静态字段很重要,因为它们是从上到下初始化的。在您的情况下,切换顺序会导致在FOO_RED初始化之前调用Foo()构造函数。因此,FOO_RED将null用于构造函数中。这是合法的,但显然对任何想要使用FOO_RED的控件都没用。