Почему тернарный оператор ведет себя по-разному при двойном вызове геттера?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему тернарный оператор ведет себя по-разному при двойном вызове геттера?

Сообщение Anonymous »

Я пытаюсь понять поведение Java при вычислении тернарного оператора при вызове метода.
Рассмотрим этот упрощенный пример:

Код: Выделить всё

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

Вернуться в «JAVA»