在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
块中设置了断点,我可以看到地图正确填充,但它好像静态方法不知道正在执行的初始化程序。
任何人都可以解释这种行为吗?
更新:我已经添加了更详细的代码。它仍然不是1:1(这里有几张地图和更多的逻辑),但我已经明确地查看了allCountries
的声明/参考,它们如上所列。
您可以看到完整的初始化代码here。
更新#2:我试图尽可能简化代码,并在飞行中写下它。实际的代码在初始化程序后有静态变量声明。正如乔恩在下面的答案中指出的那样,这导致它重置参考。
我修改了我的帖子中的代码以反映这一点,所以对于发现问题的人来说更清楚。对不起每个人都很困惑。我只是想让每个人的生活更轻松:)。
感谢您的回答!
你可以显示你初始化地图的代码吗? – Tom 2012-03-13 22:12:54
顺便说一句,你在示例中缺少findByISO()方法的返回类型。 – 2012-03-13 22:18:10