JLS中有关于执行静态初始化块顺序的任何保证吗?
我想知道使用像下面这样的结构是否可靠:
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
的块之前执行?
(关于为什么我不在上层init结束时执行msgSource
初始化:block:只是味道的问题;如果所描述的构造不可靠,我会这样做)
是的,静态初始化块保证按文本顺序执行。
从JLS中,第12.4.1节:
目的是一个类或接口类型有一组初始化器将其置于一致状态,并且此状态是其他类所观察到的第一个状态。 静态初始化器和类变量初始化器按文本顺序执行 ,并且可能不引用在类声明中声明的类变量,即使这些类变量在作用域内(第8.3.3节)。 此限制旨在在编译时检测大多数循环或其他格式不正确的初始化。
从12.4.2开始:
接下来, 按照文本顺序执行该类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。
就个人而言,我会在开始时放置所有变量声明,然后放入一个静态初始化块。 我认为这要容易得多。
链接地址: http://www.djcxy.com/p/38061.html上一篇: Are there any guarantees in JLS about order of execution static initialization blocks?