From the JLS:
15.26.2. Compound Assignment Operators
A compound assignment expression of the form E1 op= E2
is equivalent to E1 = (T) ((E1) op (E2))
, where T
is the type of E1
, except that E1
is evaluated only once.
15.22.2. Boolean Logical Operators &
, ^
, and |
When both operands of a &
, ^
, or |
operator are of type boolean
or Boolean
, then the type of the bitwise operator expression is boolean
. In all cases, the operands are subject to unboxing conversion (§5.1.8) as necessary.
For |
, the result value is false if both operand values are false; otherwise, the result is true.
This means that
val |= somethingElse();
is strictly equivalent to
val = val | somethingElse();
(assuming somethingElse()
returns boolean
or Boolean
).
I'd be curious if right operand is evaluated if left value already is true.
Yes, it would be evaluated, since |
does not short-circuit:
15.7.2. Evaluate Operands before Operation
The Java programming language guarantees that every operand of an operator (except the conditional operators &&
, ||
, and ? :
) appears to be fully evaluated before any part of the operation itself is performed.
15.24. Conditional-Or Operator ||
Thus, ||
computes the same result as |
on boolean
or Boolean
operands. It differs only in that the right-hand operand expression is evaluated conditionally rather than always.