我有这门课,比方说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}} 静态字段的顺序是否重要?
答案 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_RED
为null
)。然后静态字段按其显示的顺序初始化。因此可以在初始化之前观察FOO_RED
字段。
答案 2 :(得分:1)
排序对静态字段很重要,因为它们是从上到下初始化的。在您的情况下,切换顺序会导致在FOO_RED初始化之前调用Foo()构造函数。因此,FOO_RED将null
用于构造函数中。这是合法的,但显然对任何想要使用FOO_RED的控件都没用。