加载类时未初始化静态变量

Sud*_*oer 2 java initialization static-members

我有一个关于初始化的有趣问题.我有以下代码:

public class ErrorLookupProvider {  

private static final ErrorLookupProvider INSTANCE = new ErrorLookupProvider();

private  static Map<Long, List<String>> map = new HashMap<Long, List<String>>();

    private ErrorLookupProvider() {
        init();
    }

    private void init() {
        map.put(123L, ImmutableList.of("abc", "def"));
    }

    public static ErrorLookupProvider getInstance() {
        return INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我打电话时ErrorLookupProvider.getInstance(),我打了一个NPE.里面的地图init()没有用new初始化HashMap.

如果我将声明更改map为final,那么我会看到它已初始化.或者,即使我删除静态并使其成为私有类变量private Map<.....>也是如此.

我无法弄清楚为什么会这样.有人能解释一下这里发生了什么吗?

Dav*_*ton 5

切换地图和单例实例初始化的顺序.

静态初始化按源在源中遇到的顺序发生.

参见JLS 12.4.2详细初始化程序,步骤6(final部分)和9("顺序"部分).

(单独的实现和在静音中的静态问题,单独的问题.)