Java: есть ли риск зависеть от последовательности инициализации поля? - PullRequest
0 голосов
/ 05 января 2019

Я использую инициализацию по умолчанию с полями классов, как это. Полагаю, поля будут инициализированы в такой последовательности:

class NormalInit {
    int i = 3;
    LocalDate h = LocalDate.now();
    public int year = h.getYear(); // is it safe?
}

Мой вопрос:

(1) Правильно ли мое предположение о последовательности (это гарантируется спецификациями java или jvm)?

(2) Есть ли какая-либо распространенная ошибка / ловушка при такого рода инициализации?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

h зависит от year, JVM не будет переупорядочивать эти назначения.

но i не имеет зависимости, поэтому JVM может поставить свой init в любой момент конструирования.

0 голосов
/ 05 января 2019

Должно быть в порядке. Согласно модели памяти Java и спецификации языка операторы оцениваются в одном потоке сверху вниз.

Порядок блоков инициализации https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4

4. Выполните инициализаторы экземпляров и инициализаторы переменных экземпляра для этого класса, присваивая значения инициализаторов переменных экземпляра соответствующим переменным экземпляра, в порядке слева направо, в котором они появляются текстово в исходном коде для класса , Если выполнение любого из этих инициализаторов приводит к исключению, то дальнейшие инициализаторы не обрабатываются, и эта процедура резко завершается с тем же исключением

Эта ссылка для объяснения «до и после»: https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.5

Если x и y являются действиями одного и того же потока и x предшествует y в программном порядке, то hb (x, y).

Технически присвоение i и h может быть изменено, но в вашем случае это не повлияет на семантику программы.

...