Недавно я наткнулся на это на работе. Хотя я не уверен, что это действительно хорошая идея, я не понимаю, как обрабатываются статические блоки компилятором.
Вот пример:
Учтите, что у вас есть классы 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
до того, как он будет потенциально использован в другом месте?