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?

下一篇: Fetching data from Key Value JSON object