初期化について興味深い質問があります。私は次のコードを持っています:
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;
}
}
今、私が電話をするときErrorLookupProvider.getInstance()
、私はNPEを打ちます。内部のマップinit()
は新しいで初期化されていませんHashMap
。
の宣言をmap
finalに変更すると、初期化されていることがわかります。または、staticを削除してプライベートクラス変数にしたとしても、private Map<.....>
それも機能します。
なぜこれが起こるのか理解できませんでした。誰かがここで何が起こっているのか説明できますか?