Tengo una clase Set (Esto es J2ME, por lo que tengo acceso limitado a la API estándar, solo para explicar mi aparente reinvención de la rueda). Estoy usando mi clase set para crear conjuntos de cosas constantes en clases y subclases. De alguna manera se parece a esto ...¿Puedo garantizar el orden en que se ejecutan los inicializadores estáticos en Java?
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] */
}};
}
Todo parece bien, excepto la línea en [1] provoca una excepción de puntero nulo. Presumiblemente esto significa que el inicializador estático en la subclase se está ejecutando antes que el de la clase padre. Esto me sorprendió porque habría pensado que primero ejecutaría los bloques estáticos en cualquier importación nueva, antes de ejecutar cualquiera en la subclase instatiated.
¿Estoy en lo correcto en esta suposición? ¿Hay alguna forma de controlar o evitar este comportamiento?
Actualización:
cosas son aún más extraño. Probé este lugar (Tenga en cuenta el 'nuevo ParentClass()' línea):
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");
}};
}
y la salida es extraño:
a
["one", "two", "three"]
b
c
d
e
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
Así ParentClass es inicializado, pero la subclase no tienen acceso a en su inicializador estático.
Sí ... eso hace lo mismo. – izb
Creo que Elijah lo hizo bien. Esto no es un problema de orden de iniciación, sino más bien una especie de choque de nombres. – boutta
En mi código real, en realidad tengo 3 clases donde A <-B <-C. La excepción fue en B. Resulta interesante que cada clase con su propio nombre de conjunto mueva la excepción a C, pero no resuelve el problema. Esto simplemente implica que el orden realmente es impredecible. – izb