У меня есть класс 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 инициализирован, но у подкласса нет доступа к нему в его статическом инициализаторе.