Не совсем отвечаю на вопрос, но спрашиваю больше здесь -). Просто наткнулся на интересный пример с порядком инициализации статического поля. Вот пример:
public class Foo {
private static final Long result = method1();
private static String string = "something";
private static Long method1() {
if (string == null) {
throw new IllegalStateException("BOOM");
}
return 1L;
}
public static void main(String[] args) {
System.out.println("here");
}
}
Это создаст исключение IllegalStateException. Я понимаю, что последовательность здесь заключается в том, что сначала мы оцениваем поле «result», которое вызывает method1 () и обходит инициализацию значения «string». «string» должен быть константой, но я забыл поставить модификатор «final», когда писал тесты. Но должны ли такие случаи обрабатываться во время выполнения? То есть, когда мы вызываем «if (string == null)», должен ли JRE быть достаточно умным, чтобы проверить и убедиться, что «string» не была инициализирована и инициализировать ее?