我不知道它的使用可靠的建筑,如:

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);
}

有一种可能性,即我会得到 NullPointerExceptionmsgSource 初始化框会之前执行该框其初始化 engMessages?

(约为什么不让我做 msgSource 初始化时结束的上init。块:仅仅是品味问题;我会这样做,如果所述建筑是不可靠)

有帮助吗?

解决方案

是的,静态的初块都保证执行在文字顺序。

从捷尔思, 第12.4.1:

意图是,一类或口类型都有一套初始化,把它放在一个一致的国家,这个国家是第一个国家观察到的其他课程。 静态的初始化程序和类变量的初始化程序执行的文本了, 不可参阅类变量中所声明的类的声明中出现的文本之后使用,尽管这些类变量是在范围(第8.3.3).这种限制是设计来检测,在编制时,大多数的圆形或者错误的初始化。

和从 12.4.2:

接下来,执行任何一类的变量的初始化程序和初始化时的静态分类,或现场初始化的接口, 在文本了, ,因为虽然他们是一个单一的区块。

个人虽然,我会把所有的变量声明在开始,然后一个静态的初始化程序块。我认为这是一个很容易遵守。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top