el código es la adición de todos los miembros de una Collection
usando el método que devuelve un add()
boolean
, que indica si el add()
tuvieron éxito o no. Lo que hace el método addAll
es devolver true
si alguna de las adiciones tuvo éxito y false
si todas fallaran. (Esto me parece extraño, ya que sólo volvería true
si todos los adds fuera exitosa, pero estoy divagando.)
por lo que podría hacerlo de esta manera:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
if (add(e)) {
result = true;
}
}
return result;
}
Pero que es un poco verbosa como se puede actuar sobre la variable result
más directamente:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result = add(e) || result;
}
return result;
}
Así que estamos lógicamente O-ing el valor antiguo de result
con el valor de retorno de add
para obtener el nuevo valor. (Nota: queremos que result
esté en el lado derecho del ||
; esto es porque ||
"cortocircuitos" y no se molesta en verificar el lado derecho de un ||
si el lado izquierdo es). Por lo tanto, si add(e)
y result
fueran al revés, no evaluaría el lado derecho, es decir, no ejecutaría el método add()
, una vez que result
fuera true
.)
Quien escribió que el método de decidir que quería ser lo más conciso posible, de manera que cambiaron:
result = add(e) || result;
a:
result |= add(e);
que es lo mismo que:
result = result | add(e);
El |
operator is a bitwise OR que no es lo mismo un OR lógico, a excepción de booleanos donde el efecto es básicamente el s La única diferencia es que el |
no tiene el comportamiento de cortocircuito mencionado anteriormente.
No existe una sintaxis ||=
en Java, razón por la cual se está utilizando OR a nivel de bits, aunque incluso si lo hiciera, probablemente tendría el mismo problema de cortocircuito mencionado anteriormente.
Con una versión en cortocircuito, no esperaría más adiciones para ser hecho después de que uno devuelva verdadero, lo cual sería sorprendente dado el contrato implícito del nombre del método ... –
¡Brillante, gracias! – user452915
@Donal Fellows: buen punto sobre el cortocircuito de '||'. Han cambiado la respuesta para reflejar esto. –