A partir de la especificación del lenguaje Java - 15.26.2 Compound Assignment Operators.
Una expresión de asignación compuesto de la forma E1 op= E2
es equivalente a E1 = (T)((E1) op (E2))
, donde T
es el tipo de E1
, excepto que E1
se evalúa sólo una vez.
Así a &= b;
es equivalente a a = a & b;
.
(En algunos usos, el tipo de fundición hace una diferencia en el resultado, pero en ésta b
tiene que ser boolean
y el tipo de fundición no hace nada.)
En la práctica, no es poca diferencia entre a = a & b;
y a = a && b;
. Si b
es una variable o una constante, el resultado será el mismo para ambas versiones. Solo hay una diferencia semántica cuando la evaluación de b
puede tener efectos secundarios; es decir, cuando es una subexpresión no trivial.
En cuanto al rendimiento, la disyuntiva es entre el costo de la evaluación de b
, y el costo de una prueba y rama del valor de a
, y el ahorro potencial de evitar una asignación innecesaria a a
. El análisis no es directo, pero a menos que el costo de calcular b
no sea trivial, la diferencia de rendimiento potencial entre las dos versiones probablemente sea demasiado pequeña para que valga la pena considerarla.
Así (un &= b;) se provoque un cortocircuito si b es una llamada de método? ¿Hay algo así como un operador "&& ="? – is7s
correcto. b() se llama. No hay un operador && = – stew
Parece que esto no responde la pregunta; el OP ya sabía sobre cortocircuitos. –