2

我想知道使用以下结构是否可靠:

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.block 末尾进行初始化:只是口味问题;如果所描述的结构不可靠,我会这样做)

4

1 回答 1

8

是的,静态初始化程序块保证以文本顺序执行。

从 JLS,第 12.4.1 节

目的是类或接口类型有一组初始化器,将其置于一致状态,并且此状态是其他类观察到的第一个状态。静态初始化器和类变量初始化器以文本顺序执行,并且不能引用在使用后以文本形式出现的类中声明的类变量,即使这些类变量在范围内(第 8.3.3 节)。此限制旨在在编译时检测大多数循环或其他格式错误的初始化。

12.4.2开始:

接下来,按文本顺序执行类的类变量初始化程序和静态初始化程序,或者接口的字段初始化程序,就好像它们是一个块一样。

不过就个人而言,我会将所有变量声明放在开头,然后是一个静态初始化程序块。我认为这更容易理解。

于 2010-06-12T09:53:40.047 回答