tengo este código¿Por qué el orden de las declaraciones es importante para los inicializadores estáticos?
private static Set<String> myField;
static {
myField = new HashSet<String>();
myField.add("test");
}
y funciona. Pero cuando cambio el orden, recibo un error de referencia directa.
static {
myField = new HashSet<String>();
myField.add("test"); // illegal forward reference
}
private static Set<String> myField;
estoy un poco sorprendido, no esperaba algo así de Java. :)
¿Qué sucede aquí? ¿Por qué es importante el orden de las declaraciones? ¿Por qué funciona la asignación, pero no la llamada al método?
OK, entiendo. Pero después de la asignación inicial, myField * está * inicializado. ¿Por qué aún no puedo llamar al método add? –
Si esos tres requisitos no existieran, podría crear una referencia directa implícita utilizando variables locales en el inicializador, ¿no? ¿Es ese el motivo de estas restricciones? –
ths JLS dice: "... Estas restricciones están diseñadas para capturar, en tiempo de compilación, inicializaciones circulares o malformadas ..." –