Скажите, что у вас есть этот фрагмент кода
private final Set set = new HashSet() {{ add(1); }};
SomeConstructor() {
printSet();
}
long printSet() {
new Thread(() -> {System.out.println(set)}).start();
}
например, если компилятор решил сделать это похожим на
private final Set set;
SomeConstructor() {
printSet();
set = new HashSet() {{ add(1); }};
}
это было бы проблемой, потому что calculateWaitTime() создает новый поток, который может видеть набор как нулевой или не иметь в нем 1.
Итак, еще раз вопрос, возможно ли это переупорядочение? Или все окончательные поля, инициализированные вне конструктора, инициализируются перед конструктором или, по крайней мере, всегда перемещаются компилятором в верхнюю часть конструктора.