Solución:
El cortocircuito es cuando se deja de evaluar una expresión tan pronto como se determina su resultado. Entonces, por ejemplo:
if (a == b || c == d || e == f) {
// Do something
}
Si a == b
es verdad, entonces c == d
y e == f
están nunca evaluado en absoluto, porque el resultado de la expresión ya se ha determinado. si a == b
es falso, entonces c == d
se evalúa; si es cierto, entonces e == f
nunca se evalúa. Es posible que esto no parezca hacer ninguna diferencia, pero considere:
if (foo() || bar() || baz()) {
// Do something
}
Si foo()
devuelve verdadero, entonces bar
y baz
están nunca llamado, porque el resultado de la expresión ya se ha determinado. Así que si bar
o baz
tiene algún otro efecto que simplemente devolver algo (un efecto secundario), esos efectos nunca ocurren.
Un gran ejemplo de cortocircuito se relaciona con las referencias a objetos:
if (a != null && a.getFoo() != 42) {
// Do something
}
a.getFoo()
normalmente lanzaría un NullPointerException
si a
fueron null
, pero debido a que la expresión cortocircuitos, si a != null
es false
, los a.getFoo()
parte nunca sucede, por lo que no obtenemos una excepción.
Tenga en cuenta que no todas las expresiones están en cortocircuito. los ||
y &&
los operadores están en cortocircuito, pero |
y &
no son, ni son *
o /
; de hecho, la mayoría de los operadores no lo son.
La evaluación de cortocircuito significa que al evaluar expresiones booleanas (lógica AND
y OR
) puede detenerse tan pronto como encuentre la primera condición que satisfaga o niegue la expresión.
Por ejemplo, suponga que está evaluando una lógica OR
con varias sub-expresiones, cada una de las cuales es muy costosa de evaluar:
if (costlyTest1() || costlyTest2() || costlyTest3()) { // ...
La JVM puede dejar de evaluar las funciones “costlyTest” tan pronto como encuentre una que devuelva true
, ya que eso satisfará inmediatamente la expresión booleana. Así que si costlyTest1()
devuelve verdadero, entonces se omitirán las otras pruebas. Similar:
if (costlyTest1() && costlyTest2() && costlyTest3()) { // ...
La JVM puede dejar de evaluar las funciones tan pronto como encuentre una que devuelva false
, ya que inmediatamente niega la expresión; Así que si costlyTest1()
devuelve falso, entonces las otras funciones no serán llamadas.
Estas reglas pertenecen a cualquier nivel de anidamiento de expresiones booleanas y se pueden aprovechar para evitar trabajos innecesarios, como se demuestra en los ejemplos anteriores.
Short Circuit
: Si la primera parte es true
no se moleste en evaluar el resto de la expresión. La misma lógica se aplica a false
En el caso de &&
que también está en cortocircuito