2010-09-22 12 views
7

Necesito ayuda sobre este extraño operador |=. ¿Puedes explicarme qué hace este código?Java | = pregunta del operador

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

Respuesta

2

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.

+1

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

+0

¡Brillante, gracias! – user452915

+0

@Donal Fellows: buen punto sobre el cortocircuito de '||'. Han cambiado la respuesta para reflejar esto. –

6

Es una taquigrafía para:

result = result | add(e); 

Cuando el | es el operador binario OR.

+0

Si tuviera que explicar esto a un programador no programado. ¿Qué sería? – user452915

+0

¿Sabe el no programador qué son los números binarios y OR? Si no, explique ésos primero. En caso afirmativo, realice el OR a nivel de bits en las representaciones binarias del contenido del resultado y el resultado de la llamada agregue (e) y almacene la respuesta en la referencia del resultado. – duffymo

+3

En realidad, es lógico O porque se aplica al tipo 'boolean'. No es que el efecto neto sea diferente. –

0

Es un OR-ing bit a bit de result y add(e) y lo vuelve a asignar al resultado. La notación abreviada en lugar de escribir result = result | add(e)

2

es la abreviatura de result = result | agregar (e). La tubería es el operador bitwise or.

0

El operador de asignación (|=) establece la variable en el LHS en el valor que anteriormente contenía OR-ed con el resultado de evaluar el RHS. Para los tipos booleanos (como en este ejemplo), cambia la variable para que contenga verdadero cuando el valor es verdadero (y no tiene ningún efecto neto). Lo hace no cortocircuito evaluar.

El efecto general del método es llamar al método add del objeto actual para cada elemento de la colección de argumentos y devolver verdadero si cualquiera de esas llamadas a add devuelve verdadero (es decir, si realmente se agregó algo, bajo condiciones razonables) suposiciones sobre el significado del resultado de add ...)