Почему тернарный оператор ведет себя по-разному при двойном вызове геттера?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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