Что такое короткое замыкание и как оно используется при программировании на Java?
Возможный дубликат:
Ява оценивает оставшиеся условия после получения логического результата
Почему мы обычно используем ||
not |
, в чем разница?
Я пропустил классную лекцию на днях, и мне было интересно, может ли кто-нибудь объяснить, что такое короткое замыкание, и, может быть, пример того, что он используется в простой программе Java. Спасибо за вашу помощь!
Ответы
Ответ 1
Короткое замыкание - это то, где выражение останавливается, оценивается, как только его результат определяется. Так, например:
if (a == b || c == d || e == f) {
// Do something
}
Если a == b
истинно, то c == d
и e == f
никогда не оцениваются вообще, потому что результат выражения уже определен. если a == b
является ложным, тогда оценивается c == d
; если это правда, то e == f
никогда не оценивается. Возможно, это не имеет никакого значения, но подумайте:
if (foo() || bar() || baz()) {
// Do something
}
Если foo()
возвращает true, то bar
и baz
никогда не называются, потому что результат выражения уже определен. Поэтому, если bar
или baz
имеет какой-то другой эффект, чем просто что-то возвращать (побочный эффект), эти эффекты никогда не возникают.
Один прекрасный пример короткого замыкания относится к объектным ссылкам:
if (a != null && a.getFoo() != 42) {
// Do something
}
a.getFoo()
обычно генерирует NullPointerException
, если a
был null
, но поскольку выражение short-circuit, если a != null
равно false
, часть a.getFoo()
никогда не происходит, поэтому мы надеваем Получаем исключение.
Обратите внимание, что не все выражения закорочены. Операторы ||
и &&
закорочены, но |
и &
не являются и не являются *
или /
; на самом деле большинство операторов не являются.
Ответ 2
Оценка коротких замыканий означает, что при оценке булевых выражений (логический AND
и OR
) вы можете остановиться, как только найдете первое условие, которое удовлетворяет или отрицает выражение.
Например, предположим, что вы оцениваете логический OR
с несколькими подвыражениями, каждый из которых очень дорог для оценки:
if (costlyTest1() || costlyTest2() || costlyTest3()) { // ...
JVM может перестать оценивать функции "costlyTest", как только найдет тот, который возвращает true
, поскольку это будет удовлетворять булевому выражению. Поэтому, если costlyTest1()
возвращает значение true, другие тесты будут пропущены. Аналогично:
if (costlyTest1() && costlyTest2() && costlyTest3()) { // ...
JVM может перестать оценивать функции, как только найдет тот, который возвращает false
, так как это также удовлетворяет выражению; поэтому, если costlyTest1()
возвращает false, другие функции не будут вызываться.
Эти правила относятся к любому уровню вложения булевых выражений и могут быть использованы во избежание ненужной работы, как показано в приведенных выше примерах.
Ответ 3
Short Circuit
: Если первая часть true
, не надо оценивать остальную часть выражения. Такая же логика применяется для false
в случае &&
, которая также коротко замыкается
Ответ 4
Короткое замыкание оценки выражения означает, что перед поиском его значения нужно оценить только часть выражения. Например:
a == null || a.size() == 0
Если a
- null
, подвыражение a.size() == 0
не будет оцениваться, потому что логический оператор ||
оценивается как true
, если один из его операндов true
.
Аналогично, для этого выражения:
a != null && a.size() > 0
Если a
- null
, то a.size() > 0
не будет оцениваться, потому что логический оператор &&
оценивается как false
, если один из его операндов false
.
В приведенных выше примерах булевы операторы &&
и ||
называются короткозамкнутыми, учитывая тот факт, что второй операнд не может быть оценен, если значение первого операнда достаточно для определения значения все выражение. Для сравнения операнды &
и |
являются эквивалентными булевыми операторами без коротких замыканий.
Ответ 5
Короткое замыкание - это альтернативный способ использования логических операторов AND или OR (& or |)
например. не короткое замыкание ИЛИ
if(false | true) {
}
Первое условие и второе условие оцениваются, даже если false не является истинным (что всегда есть).
Однако он был записан как короткое замыкание ИЛИ:
if(false || true) {
}
Первое условие оценивается только потому, что оно ложно, значение true не оценивается, так как оно не требуется.