2012-02-18 6 views
11

Можно создать дубликат:
Does java evaluate remaining conditions after boolean result is known
Why do we usually use || not |, what is the difference?Что такое короткое замыкание и как оно используется при программировании на Java?

Я пропустил мой класс лекцию другой день, и мне было интересно, если кто-нибудь может дать объяснение, что короткое замыкание является и может быть примером он используется в простой программе Java. Спасибо за вашу помощь!

+3

http://en.wikipedia.org/wiki/Short-circuit_evaluation – Matt

ответ

26

Короткое замыкание - это то, где выражение останавливается, когда оценивается его результат. Так, например:

if (a == b || c == d || e == f) { 
    // Do something 
} 

Если a == b верно, то c == d и e == f являются никогда не оцененную на всех, потому что результат Выражение в уже определен. если a == b неверно, тогда оценивается c == d; если это true, то e == f никогда не оценивается. Это может показаться не имеет никакого значения, но учтите:

if (foo() || bar() || baz()) { 
    // Do something 
} 

Если foo() возвращает истину, то bar и baz не не называли, потому что результат Выражение в уже определен. Так что если bar или baz имеет некоторый другой эффект, чем просто что-то возвращать (побочный эффект ), эти эффекты никогда не возникают.

Один большой пример короткого замыкания относится к объекту ссылки:

if (a != null && a.getFoo() != 42) { 
    // Do something 
} 

a.getFoo() обычно бросить NullPointerException если a были null, но из-за экспрессии коротких замыканий, если a != null является false, то a.getFoo() часть никогда не бывает, поэтому мы не получаем исключения.

Обратите внимание, что не все выражения закорочены. Операторы || и && являются короткозамкнутыми, но | и & не являются и не являются * или /; на самом деле большинство операторов - нет.

2

Short Circuit: Если первая часть - true, не надо оценивать остальную часть выражения. Такая же логика применяется для false в случае &&, которая также является короткой замыкающей.

+0

Точнее: прекратите оценивать логическое выражение, как только результат будет определен. – biziclop

+1

Вы только что сказали, что Java оценивает только первую часть выражения. – Jeffrey

+0

Почему downvote? – Cratylus

0

Короткое замыкание оценки выражения означает, что перед его вычислением необходимо оценить только часть выражения. Например:

a == null || a.size() == 0 

Если a является null, то a.size() == 0 Подвыражение не будет оцениваться, так как логический оператор || вычисляет true, если один из операндов является true.

Аналогично, для этого выражения:

a != null && a.size() > 0 

Если a является null, то a.size() > 0 не будет оцениваться, так как логический оператор && вычисляет false, если один из операндов является false.

В приведенных выше примерах логические операторы && и ||, как говорят, короткое замыкание, учитывая тот факт, что второй операнд не может быть оценен, если значение первого операнда достаточно, чтобы определить значение всего выражения , Для сравнения, операнды и | являются эквивалентными булевыми операторами без короткого замыкания.

3

Short-circuit evaluation означает, что при оценке булевых выражений (логических AND и OR) вы можете остановиться, как только вы найдете первое условие, которое удовлетворяет или отрицает выражение.

Например, предположим, что вы оценивали логическую OR с несколькими суб-выражений, каждое из которых является очень дорогостоящим, чтобы оценить:

if (costlyTest1() || costlyTest2() || costlyTest3()) { // ... 

Виртуальная машина Java может остановить оценки «costlyTest» функции, как только он находит тот, который возвращает true, так как это будет удовлетворять булевому выражению. Поэтому, если costlyTest1() возвращает true, другие тесты будут пропущены. Аналогично:

if (costlyTest1() && costlyTest2() && costlyTest3()) { // ... 

Виртуальная машина Java может остановить вычисление функций, как только он находит, что возвращает false, так как это также удовлетворяет выражение; поэтому, если costlyTest1() возвращает false, другие функции не будут вызываться.

Эти правила относятся к любому уровню вложения булевых выражений и могут быть использованы во избежание ненужной работы, как показано в приведенных выше примерах.

+0

А, я вижу. Это было достаточно просто. Спасибо за ваше быстрое и ясное объяснение! –

0

Короткое замыкание является альтернативным способом с использованием логического элемента И или ИЛИ операторов (& или |)

например, A Non короткого замыкания ИЛИ

if(false | true) { 

} 

Первое условие и второе условие оба оценены, даже если ложь не верно (что она всегда есть).

Однако она была написана как короткое замыкание или:

if(false || true) { 

} 

Первое условие вычисляется только, так как оно ложно, правда, не вычисляется, так как это не требуется.