私は Set クラスを持っています (これは J2ME なので、標準 API へのアクセスは制限されています。私の明白な車輪の再発明を説明するためです)。セットクラスを使用して、クラスとサブクラスで定数セットを作成しています。なんかこんな感じ…
class ParentClass
{
protected final static Set THE_SET = new Set() {{
add("one");
add("two");
add("three");
}};
}
class SubClass extends ParentClass
{
protected final static Set THE_SET = new Set() {{
add("four");
add("five");
add("six");
union(ParentClass.THE_SET); /* [1] */
}};
}
[1] の行でヌル ポインター例外が発生することを除いて、すべて問題ないように見えます。おそらくこれは、サブクラスの静的イニシャライザーが親クラスの前に実行されていることを意味します。インスタンス化されたサブクラスで実行する前に、最初に新しいインポートで静的ブロックを実行すると思っていたので、これは私を驚かせました。
私はこの仮定で正しいですか?この動作を制御または回避する方法はありますか?
アップデート:
物事はさらに奇妙です。代わりにこれを試しました(「new ParentClass()」行に注意してください):
class ParentClass
{
public ParentClass()
{
System.out.println(THE_SET);
}
protected final static Set THE_SET = new Set() {{
add("one");
add("two");
add("three");
}};
}
class SubClass extends ParentClass
{
protected final static Set THE_SET = new Set() {{
System.out.println("a");
new ParentClass();
System.out.println("b");
add("four");
System.out.println("c");
add("five");
System.out.println("d");
add("six");
System.out.println("e");
union(ParentClass.THE_SET); /* [1] */
System.out.println("f");
}};
}
そして出力は奇妙です:
a
["one", "two", "three"]
b
c
d
e
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
したがって、ParentClass は初期化されますが、サブクラスはその静的初期化子でそれにアクセスできません。