¿Llamar a un método estático en una clase en Java activa los bloques de incialización estáticos para que se ejecuten?Inicializadores estáticos y métodos estáticos En Java
Empíricamente, yo diría que no. Tengo algo como esto:
public class Country {
static {
init();
List<Country> countries = DataSource.read(...); // get from a DAO
addCountries(countries);
}
private static Map<String, Country> allCountries = null;
private static void init() {
allCountries = new HashMap<String, Country>();
}
private static void addCountries(List<Country> countries) {
for (Country country : countries) {
if ((country.getISO() != null) && (country.getISO().length() > 0)) {
allCountries.put(country.getISO(), country);
}
}
}
public static Country findByISO(String cc) {
return allCountries.get(cc);
}
}
En el código utilizando la clase, hacer algo como:
Country country = Country.findByISO("RO");
El problema es que tengo un NullPointerException
porque el mapa (allCountries
) no se ha inicializado. Si configuro puntos de interrupción en el bloque static
, puedo ver que el mapa se llena correctamente, pero es como si el método estático no tuviera conocimiento de la ejecución del inicializador.
¿Alguien puede explicar este comportamiento?
Actualización: He añadido más detalle al código. Todavía no es 1: 1 (hay varios mapas allí y más lógica), pero he examinado explícitamente las declaraciones/referencias de allCountries
y están como se enumeran arriba.
Puede ver el código de inicialización completo here.
Actualización # 2: Intenté simplificar el código tanto como sea posible y lo anoté sobre la marcha. El código real tenía la declaración de la variable estática después del inicializador. Eso provocó que restableciera la referencia, como señaló Jon en la respuesta a continuación.
Modifiqué el código en mi publicación para reflejar esto, por lo que es más claro para las personas que encuentran la pregunta. Perdón por la confusión de todos. Solo estaba tratando de hacer la vida de todos más fácil :).
Gracias por sus respuestas!
¿Puedes mostrar el código con el que iniciaste el mapa? – Tom
Por cierto, le falta el tipo de devolución del método findByISO() en su ejemplo. –