Why doesn't Java have compound assignment versions of the conditional-and and conditional-or operators? (&&=, ||=)
Reason
The operators &&=
and ||=
are not available on Java because for most of the developers these operators are:
- error-prone
- useless
Example for &&=
If Java allowed &&=
operator, then that code:
bool isOk = true; //becomes false when at least a function returns false
isOK &&= f1();
isOK &&= f2(); //we may expect f2() is called whatever the f1() returned value
would be equivalent to:
bool isOk = true;
if (isOK) isOk = f1();
if (isOK) isOk = f2(); //f2() is called only when f1() returns true
This first code is error-prone because many developers would think f2()
is always called whatever the f1() returned value. It is like bool isOk = f1() && f2();
where f2()
is called only when f1()
returns true
.
If the developer wants f2()
to be called only when f1()
returns true
, therefore the second code above is less error-prone.
Else &=
is sufficient because the developer wants f2()
to be always called:
Same example but for &=
bool isOk = true;
isOK &= f1();
isOK &= f2(); //f2() always called whatever the f1() returned value
Moreover, the JVM should run this above code as the following one:
bool isOk = true;
if (!f1()) isOk = false;
if (!f2()) isOk = false; //f2() always called
Compare &&
and &
results
Are the results of operators &&
and &
the same when applied on boolean values?
Let's check using the following Java code:
public class qalcdo {
public static void main (String[] args) {
test (true, true);
test (true, false);
test (false, false);
test (false, true);
}
private static void test (boolean a, boolean b) {
System.out.println (counter++ + ") a=" + a + " and b=" + b);
System.out.println ("a && b = " + (a && b));
System.out.println ("a & b = " + (a & b));
System.out.println ("======================");
}
private static int counter = 1;
}
Output:
1) a=true and b=true
a && b = true
a & b = true
======================
2) a=true and b=false
a && b = false
a & b = false
======================
3) a=false and b=false
a && b = false
a & b = false
======================
4) a=false and b=true
a && b = false
a & b = false
======================
Therefore YES we can replace &&
by &
for boolean values ;-)
So better use &=
instead of &&=
.
Same for ||=
Same reasons as for &&=
:
operator |=
is less error-prone than ||=
.
If a developer wants f2()
not to be called when f1()
returns true
, then I advice the following alternatives:
// here a comment is required to explain that
// f2() is not called when f1() returns false, and so on...
bool isOk = f1() || f2() || f3() || f4();
or:
// here the following comments are not required
// (the code is enough understandable)
bool isOk = false;
if (!isOK) isOk = f1();
if (!isOK) isOk = f2(); //f2() is not called when f1() returns false
if (!isOK) isOk = f3(); //f3() is not called when f1() or f2() return false
if (!isOK) isOk = f4(); //f4() is not called when ...
Probably because something like
x = false;
x &&= someComplexExpression();
looks like it ought to be assigning to x
and evaluating someComplexExpression()
, but the fact that the evaluation hinges on the value of x
isn't apparent from the syntax.
Also because Java's syntax is based on C, and no one saw a pressing need to add those operators. You'd probably be better off with an if statement, anyway.