Что такое короткое замыкание и как оно используется при программировании на 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 не оценивается, так как оно не требуется.