Вызывает ли статический метод для класса в Java инициировать статические блоки инициализации для выполнения?Статические инициализаторы и статические методы в Java
Эмпирически, я бы сказал, нет. У меня есть что-то вроде этого:
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);
}
}
В коде, используя класс, я сделать что-то вроде:
Country country = Country.findByISO("RO");
Проблема заключается в том, что я получаю NullPointerException
потому что карта (allCountries
) не инициализирован. Если я установил точки останова в блоке static
, я вижу, что карта заполняется правильно, но это похоже на то, что статический метод не знает о выполняемом инициализаторе.
Может ли кто-нибудь объяснить это поведение?
Update: Я добавил больше деталей к коду. Это все еще не 1: 1 (там есть несколько карт и больше логики), но я явно посмотрел объявления/ссылки allCountries
, и они перечислены выше.
Вы можете увидеть полный код инициализации here.
Обновление # 2: Я попытался как можно больше упростить код и записал его на лету. Фактический код имел объявление статической переменной после инициализатора. Это заставило его сбросить ссылку, как указал Джон в ответе ниже.
Я изменил код в своем посте, чтобы отразить это, поэтому для людей, которые находят этот вопрос, яснее. Прошу прощения за путаницу. Я просто пытался облегчить жизнь каждому :).
Спасибо за ваши ответы!
Вы можете указать код, с которым вы инициализируете карту? – Tom
Кстати, у вас отсутствует возвращаемый тип метода findByISO() в вашем примере. –