Взгляните на это java puzzles vid от Джоша Блоха и Уильяма Пью, со временем индекс 0: 25: 00-0: 33: 00.
Один из динамиков говорит, что если вы используете строчный boolean
вместо boolean
, тогда LIVING
будет рассматриваться как истинная "константа времени компиляции", и это уже не имеет значения, когда оно инициализируется.
Ну, это все прекрасно и денди, но посмотрите, что произойдет, когда вы вернетесь к первоначальному порядку между статическим init и конструктором, а затем выполните его с помощью простой операции "Извлечь метод". Эти две программы печатают разные выходы:
public class Elvis {
private static final Elvis ELVIS = new Elvis();
private Elvis () {}
private static final boolean LIVING = true;
private final boolean alive = LIVING;
private final boolean lives () {return alive;}
public static void main(String[] args) {
System.out.println(ELVIS.lives()); // prints true
}
}
И с рефакторизованным returnTrue()
методом
public class Elvis {
private static final Elvis ELVIS = new Elvis();
private Elvis () {}
private static final boolean LIVING = returnTrue();
private static boolean returnTrue() {
return true;
}
private final boolean alive = LIVING;
private final boolean lives () {return alive;}
public static void main(String[] args) {
System.out.println(ELVIS.lives()); // prints false
}
}
Почему извлечение метода returnTrue() изменяет вывод программы в этом случае?