il codice è l'aggiunta di tutti i membri di un Collection
utilizzando il metodo add()
che restituisce un boolean
, che indica se il add()
riuscito o meno. Il metodo addAll
restituisce true
se una delle aggiunte è riuscita e false
se tutte sono fallite. (Questo non sembra strano per me, perché mi piacerebbe tornare solo true
se tutti gli add fosse successo, ma sto divagando.)
Così si potrebbe fare in questo modo:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
if (add(e)) {
result = true;
}
}
return result;
}
ma questo è un po ' verbose, come si può agire sulla variabile result
più direttamente:
@Override
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E e : c) {
result = add(e) || result;
}
return result;
}
Quindi siamo logicamente O-ing il vecchio valore della result
con il valore di ritorno di add
per ottenere il nuovo valore. (Nota: vogliamo result
sul lato destro dello ||
; questo perché ||
"cortocircuiti" e non si preoccupa di controllare il lato destro di un ||
se il lato sinistro è true
). Quindi se add(e)
e result
erano il contrario, non valuterebbe il lato destro, cioè non eseguiva il metodo add()
- una volta result
erano true
.)
chi ha scritto che il metodo decidono volevano essere il più conciso possibile, in modo hanno cambiato:
result = add(e) || result;
a:
result |= add(e);
, che è la stessa:
result = result | add(e);
Il |
operator is a bitwise OR che non è lo stesso di un OR logico, ad eccezione dei booleani dove l'effetto è fondamentalmente la s beh, l'unica differenza è che lo |
non ha il comportamento di cortocircuito sopra menzionato.
Non esiste una sintassi ||=
in Java, motivo per cui viene utilizzato l'OR bit a bit, sebbene anche se lo facesse probabilmente avrebbe lo stesso problema di cortocircuito sopra menzionato.
fonte
2010-09-22 11:28:01
Con una versione di cortocircuito, non ci si aspetterebbe ulteriori aggiunte da fare dopo che si ritorna vero, che sarebbe sorprendente dato il contratto implicito del nome del metodo ... –
Brillante, grazie! – user452915
@Donal Fellows - buon punto sul cortocircuito di '||'. Ho cambiato la risposta per riflettere questo. –