Việc gọi một phương thức tĩnh trên một lớp trong Java có kích hoạt các khối initalization tĩnh để thực thi không?Trình khởi tạo tĩnh và phương thức tĩnh Trong Java
Theo kinh nghiệm, tôi muốn nói không. Tôi có một cái gì đó như thế này:
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);
}
}
Trong mã sử dụng lớp học, tôi làm điều gì đó như:
Country country = Country.findByISO("RO");
Vấn đề là tôi nhận được một NullPointerException
vì bản đồ (allCountries
) không được khởi tạo. Nếu tôi thiết lập các điểm ngắt trong khối static
tôi có thể thấy bản đồ được điền chính xác, nhưng dường như phương thức tĩnh không có kiến thức về trình khởi tạo đang được thực thi.
Có ai có thể giải thích hành vi này không?
Cập nhật: Tôi đã thêm chi tiết hơn vào mã. Nó vẫn không phải là 1: 1 (có một số bản đồ trong đó và logic hơn), nhưng tôi đã xem xét một cách rõ ràng các khai báo/tham chiếu của allCountries
và chúng được liệt kê ở trên.
Bạn có thể xem mã khởi tạo đầy đủ here.
Cập nhật # 2: Tôi đã cố gắng đơn giản hóa mã càng nhiều càng tốt và viết nó nhanh chóng. Mã thực tế có khai báo biến tĩnh sau initializer. Điều đó khiến nó đặt lại tham chiếu, như Jon đã chỉ ra trong câu trả lời dưới đây.
Tôi đã sửa đổi mã trong bài đăng của mình để phản ánh điều này, vì vậy sẽ rõ ràng hơn cho những người tìm thấy câu hỏi. Xin lỗi về sự nhầm lẫn mọi người. Tôi chỉ cố gắng làm cho cuộc sống của mọi người dễ dàng hơn :).
Cảm ơn câu trả lời của bạn!
bạn có thể hiển thị mã mà bạn đã khởi tạo bản đồ không? – Tom
Btw bạn đang thiếu kiểu trả về của phương thức findByISO() trong ví dụ của bạn. –