2010-09-22 17 views
7

Ho bisogno di aiuto per questo strano operatore |=. Puoi spiegarmi cosa fa questo codice?Java | = domanda operatore

@Override 
public boolean addAll(Collection<? extends E> c) { 
    boolean result = false; 
    for (E e : c) { 
     result |= add(e); 
    } 
    return result; 
} 

risposta

2

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.

+1

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 ... –

+0

Brillante, grazie! – user452915

+0

@Donal Fellows - buon punto sul cortocircuito di '||'. Ho cambiato la risposta per riflettere questo. –

6

Si è un'abbreviazione per:

result = result | add(e); 

Dove il | è l'operatore OR.

+0

Se si dovesse spiegare questo a non programmatore. Cosa sarebbe? – user452915

+0

Il non programmatore sa che numeri binari e OR significano? Se no, spiega prima quelli. In caso affermativo, eseguire l'OR bit a bit sulle rappresentazioni binarie del contenuto del risultato e l'esito della chiamata add (e) e memorizzare la risposta nel riferimento del risultato. – duffymo

+3

In realtà, è logico OR perché è applicato al tipo 'boolean'. Non che l'effetto netto sia diverso. –

0

È un OR di bit per bit result e add(e) e lo si assegna al risultato. Notazione abbreviata invece di scrivere result = result | add(e)

2

è una scorciatoia per risultato = risultato | aggiungere (e). La pipe è l'operatore bitwise or.

0

L'operatore or-assign (|=) imposta la variabile sul LHS sul valore precedentemente contenuto in OR con il risultato della valutazione del RHS. Per i tipi booleani (come in questo esempio) cambia la variabile per contenere true quando il valore è true (e in caso contrario non ha effetto netto). È non valutare il cortocircuito.

L'effetto complessivo del metodo è chiamare il metodo add dell'oggetto corrente per ogni elemento della raccolta di argomenti e restituire true se una di quelle chiamate a add restituisce true (cioè, se qualcosa è stato effettivamente aggiunto, in condizioni ragionevoli ipotesi circa il significato del risultato di add ...)