是否有任何保障在捷尔思了关于执行静态的初始化块?
-
26-09-2019 - |
题
我不知道它的使用可靠的建筑,如:
private static final Map<String, String> engMessages;
private static final Map<String, String> rusMessages;
static {
engMessages = new HashMap<String, String> () {{
put ("msgname", "value");
}};
rusMessages = new HashMap<String, String> () {{
put ("msgname", "значение");
}};
}
private static Map<String, String> msgSource;
static {
msgSource = engMessages;
}
public static String msg (String msgName) {
return msgSource.get (msgName);
}
有一种可能性,即我会得到 NullPointerException
因 msgSource
初始化框会之前执行该框其初始化 engMessages
?
(约为什么不让我做 msgSource
初始化时结束的上init。块:仅仅是品味问题;我会这样做,如果所述建筑是不可靠)
解决方案
是的,静态的初块都保证执行在文字顺序。
从捷尔思, 第12.4.1:
意图是,一类或口类型都有一套初始化,把它放在一个一致的国家,这个国家是第一个国家观察到的其他课程。 静态的初始化程序和类变量的初始化程序执行的文本了, 不可参阅类变量中所声明的类的声明中出现的文本之后使用,尽管这些类变量是在范围(第8.3.3).这种限制是设计来检测,在编制时,大多数的圆形或者错误的初始化。
和从 12.4.2:
接下来,执行任何一类的变量的初始化程序和初始化时的静态分类,或现场初始化的接口, 在文本了, ,因为虽然他们是一个单一的区块。
个人虽然,我会把所有的变量声明在开始,然后一个静态的初始化程序块。我认为这是一个很容易遵守。
不隶属于 StackOverflow