Короткое замыкание - это то, где выражение останавливается, когда оценивается его результат. Так, например:
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()
часть никогда не бывает, поэтому мы не получаем исключения.
Обратите внимание, что не все выражения закорочены. Операторы ||
и &&
являются короткозамкнутыми, но |
и &
не являются и не являются *
или /
; на самом деле большинство операторов - нет.
http://en.wikipedia.org/wiki/Short-circuit_evaluation – Matt