Недавно я наткнулся на это на работе. Хотя я не уверен, что это действительно хорошая идея, я не понимаю, как обрабатываются статические блоки компилятором.
Вот пример:
Учтите, что у вас есть классы A и B:
public class A {
public final static List<Integer> list;
static {
list = new ArrayList<>();
}
}
public class B {
public final static int dependsOnA;
static {
dependsOnA = A.list.size();
}
}
И основной класс, который просто читает B.dependsOnA.
Статический блок в B зависит от значения в A, так как он использует статическую переменную list.
Теперь код выполняется правильно и во время выполнения не создается NullPointerException. Но каков механизм, обеспечивающий инициализацию list до того, как он будет потенциально использован в другом месте?