Рассмотрим этот упрощенный пример:
Код: Выделить всё
class SampleDto {
private Integer number;
public Integer getNumber() {
System.out.println("getNumber() invoked");
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
Код: Выделить всё
SampleDto dto = new SampleDto();
dto.setNumber(42);
Integer result =
dto.getNumber() != null
? dto.getNumber()
: 100;
System.out.println("Result = " + result);
Код: Выделить всё
getNumber() invoked
getNumber() invoked
Result = 42
В моем реальном проекте геттер не является тривиальным средством доступа к полю — он содержит логику и может зависеть от изменяемого состояния. Это приводило к противоречивым результатам при использовании внутри такого троичного выражения.
Мои вопросы:
- Гарантируется ли спецификацией языка Java, что и условие, и выражение выбранной ветки оцениваются независимо?
- Выполняет ли Java какую-либо оптимизацию, чтобы избежать повторных вызовов методов?
- Сохраняет результатом метода является локальная переменная, которая считается лучшей практикой, если метод не является чистым методом доступа?
Код: Выделить всё
Integer value = dto.getNumber();
Integer result = value != null ? value : 100;
Подробнее здесь: https://stackoverflow.com/questions/798 ... tter-twice
Мобильная версия