Процесс оценки состояния в Java
Допустим, что у меня есть следующее условие:
if ( myList == null || myList.isEmpty() || xomeX == someY )
Каков порядок оценки этих условий? Влево или вправо, справа налево или случайное каждое время?
Если первая проходит, то остальные игнорируются?
Ответы
Ответ 1
Он всегда должен быть слева направо, кроме оператора присваивания =
. Вы используете оператор короткого замыкания OR
, поэтому, если первое условие true
, остальные из них не будут оцениваться.
JLS 15.24:
Условный или оператор синтаксически лево-ассоциативный (он группирует слева направо).
Во время выполнения первое выражение первого операнда оценивается; если результат имеет тип Boolean, он подвергается распаковке преобразования (п. 5.1.8).
Если результирующее значение истинно, значение условного выражения или выражения истинно, и выражение правого операнда не оценивается.
Ответ 2
Из JLS
Во время выполнения выражение левого операнда оценивается сначала [...] Если результирующее значение истинно, значение условного выражения или выражения истинно, и выражение правого операнда не оценивается.
Ответ 3
if ( myList == null || myList.isEmpty() || xomeX == someY )
Да оценка слева направо!
и
Если первое условие истинно, следующее условие не оценивается. Эта концепция называется оценкой короткого замыкания. Подробнее об этом здесь. Подобный вопрос SO, опубликованный ранее, короткое замыкание логического оператора Java
Ответ 4
1) слева направо
2) в этом случае, если одно условие истинно, оно не оценивает остальное. поэтому, если myList
равно null, он не будет вызывать оценку NullPointerException
myList.isEmpty()
(потому что он не будет ее оценивать)
Ответ 5
Каждый оператор имеет свой собственный precedence и ассоциативность.
Этих ссылок достаточно, чтобы ответить на ваш вопрос.
Ответ 6
|| является оператором короткого замыкания ИЛИ, что означает, что условия строго оцениваются слева направо, и этот процесс проверки останавливается на первом истинном результате.