原因
运算符&&=
和在Java||=
上不可用,因为对于大多数开发人员来说,这些运算符是:
示例&&=
如果 Java 允许&&=
运算符,则该代码:
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
相当于:
bool isOk = true;
if (isOK) isOk = f1();
if (isOK) isOk = f2(); //f2() is called only when f1() returns true
第一个代码很容易出错,因为许多开发人员会认为f2()
无论 f1() 返回的值如何,它都会被调用。这就像bool isOk = f1() && f2();
wheref2()
仅在f1()
返回时调用true
。
如果开发人员只想在返回f2()
时被调用,那么上面的第二个代码不太容易出错。f1()
true
Else&=
就足够了,因为开发人员希望f2()
始终被调用:
同样的例子,但对于&=
bool isOk = true;
isOK &= f1();
isOK &= f2(); //f2() always called whatever the f1() returned value
此外,JVM 应该像下面这样运行上面的代码:
bool isOk = true;
if (!f1()) isOk = false;
if (!f2()) isOk = false; //f2() always called
比较&&
和&
结果
当应用于布尔值时,运算符&&
的结果是否相同?&
让我们使用以下 Java 代码进行检查:
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;
}
输出:
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
======================
因此是的,我们可以用&&
布尔&
值替换;-)
所以更好地使用&=
而不是&&=
.
相同的||=
与 的原因相同&&=
:
运算符|=
比 . 更不容易出错||=
。
如果开发人员不想在返回f2()
时被调用,那么我建议以下替代方案:f1()
true
// 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();
或者:
// 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 ...