Ho una classe Set (questo è J2ME, quindi ho accesso limitato all'API standard, solo per spiegare la mia apparente reinvenzione delle ruote). Sto usando la mia classe set per creare serie costanti di cose in classi e sottoclassi. E 'sorta di simile a questo ...Posso garantire l'ordine in cui vengono eseguiti gli inizializzatori statici in 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] */
}};
}
Tutto sembra bene, tranne la linea a [1] causa un'eccezione puntatore nullo. Presumibilmente ciò significa che l'inizializzatore statico nella sottoclasse viene eseguito prima di quello della classe genitore. Questo mi ha sorpreso perché pensavo che avrebbe eseguito prima i blocchi statici in qualsiasi nuova importazione, prima di eseguire qualsiasi nella sottoclasse istatiated.
Ho ragione in questa ipotesi? C'è un modo per controllare o aggirare questo comportamento?
Aggiornamento:
Le cose sono ancora più strano. Ho provato questo posto (si noti la 'nuova ParentClass()' line):
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");
}};
}
e l'uscita è strana:
a
["one", "two", "three"]
b
c
d
e
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
Così ParentClass viene inizializzato, ma la sottoclasse non ha accesso a nel suo inizializzatore statico.
Sì ... fa la stessa cosa. – izb
Penso che Elijah abbia ragione. Questo non è un problema di ordine di inizializzazione, ma piuttosto una sorta di scontro di nomi. – boutta
Nel mio codice reale, ho effettivamente 3 classi dove A <-B <-C. L'eccezione era in B. Interessantemente dare a ogni classe il proprio nome di set sposta l'eccezione a C ma non risolve il problema. Ciò implica semplicemente che l'ordine è davvero imprevedibile. – izb