que - ¿Qué es el cortocircuito y cómo se usa cuando se programa en Java?
lenguaje java (5)
Posible duplicado:
¿Java evalúa las condiciones restantes después de que se conoce el resultado booleano?
¿Por qué usualmente usamos||
no|
, ¿cuál es la diferencia?
El otro día falté a mi clase y me preguntaba si alguien podría dar una explicación de lo que es el cortocircuito y quizás un ejemplo de cómo se usa en un programa Java simple. ¡Gracias por tu ayuda!
Cortocircuitar la evaluación de una expresión significa que solo una parte de la expresión debe evaluarse antes de encontrar su valor. Por ejemplo:
a == null || a.size() == 0
Si a
es null
, la a.size() == 0
no se evaluará, porque el operador booleano ||
evalúa a true
si uno de sus operandos es true
.
Del mismo modo, para esta expresión:
a != null && a.size() > 0
Si a
es null
, entonces a.size() > 0
no se evaluará, porque el operador booleano &&
evalúa como false
si uno de sus operandos es false
.
En los ejemplos anteriores, los operadores booleanos &&
y ||
se dice que son cortocircuitos, dado que el segundo operando podría no ser evaluado si el valor del primer operando es suficiente para determinar el valor de la expresión completa. Para la comparación, el &
y |
Los operandos son los operadores booleanos equivalentes sin cortocircuito.
El cortocircuito es cuando una expresión deja de evaluarse tan pronto como se determina su resultado. Así, por ejemplo:
if (a == b || c == d || e == f) {
// Do something
}
Si a == b
es verdadero, entonces c == d
y e == f
nunca se evalúan en absoluto , porque el resultado de la expresión ya se ha determinado. si a == b
es falso, entonces c == d
es evaluado; si es cierto, entonces e == f
nunca se evalúa. Esto puede parecer que no hace ninguna diferencia, pero considere:
if (foo() || bar() || baz()) {
// Do something
}
Si foo()
devuelve true, entonces bar
y baz
nunca son llamados , porque el resultado de la expresión ya ha sido determinado. Entonces, si bar
o baz
tiene algún otro efecto que no sea devolver algo (un efecto secundario ), esos efectos nunca ocurren.
Un gran ejemplo de cortocircuito se refiere a referencias de objetos:
if (a != null && a.getFoo() != 42) {
// Do something
}
a.getFoo()
normalmente lanzaría una NullPointerException
si a
fuera null
, pero debido a que la expresión se cortocircuita, si a != null
es false
, la parte a.getFoo()
nunca sucede, por lo que no obtenemos una excepción.
Tenga en cuenta que no todas las expresiones están en cortocircuito. El ||
y los operadores de &&
están cortocircuitados, pero |
y &
no son, ni son *
o /
; de hecho la mayoría de los operadores no lo son.
El cortocircuito es una forma alternativa de utilizar los operadores lógicos AND u OR (& o |)
por ejemplo, un no cortocircuito O
if(false | true) {
}
La primera condición y la segunda condición se evalúan, incluso si falso no es verdadero (como siempre lo es).
Sin embargo, fue escrito como un cortocircuito O
if(false || true) {
}
La primera condición solo se evalúa porque es falsa, la verdad no se evalúa porque no es obligatoria.
en.wikipedia.org/wiki/Short-circuit_evaluation significa que cuando evalúa expresiones booleanas ( AND
lógico y OR
), puede detenerse tan pronto como encuentre la primera condición que satisface o niega la expresión.
Por ejemplo, suponga que estaba evaluando un OR
lógico 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 satisfará la expresión booleana. De modo que si costlyTest1()
devuelve true, las otras pruebas se omitirán. Similar:
if (costlyTest1() && costlyTest2() && costlyTest3()) { // ...
La JVM puede dejar de evaluar las funciones tan pronto como encuentre una que devuelva false
, ya que también satisface la expresión; por lo que si costlyTest1()
devuelve falso, no se costlyTest1()
las otras funciones.
Estas reglas pertenecen a cualquier nivel de anidamiento de expresiones booleanas y pueden aprovecharse 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 es un cortocircuito