Java提供了一个条件和运算符以及一个条件或运算符,它们都使用一个或两个类型的操作数boolean并产生boolean结果。这些是:
&& -条件AND运算子,
||-条件或运算符。的评估<left-expr> && <right-expr>等效于以下伪代码:
{
boolean L = evaluate(<left-expr>);
if (L) {
return evaluate(<right-expr>);
} else {
// 短路第二个操作数表达式的求值
return false;
}
}
的评估<left-expr> || <right-expr>等效于以下伪代码:
{ boolean L = evaluate(<left-expr>); if (!L) { return evaluate(<right-expr>); } else { // 短路第二个操作数表达式的求值 return true; } }
如上面的伪代码所示,短路运算符的行为等效于使用if/else语句。
以下示例显示了&&运算符最常用的使用模式。比较这两种方法,以测试提供的值Integer是否为零。
public boolean isZero(Integer value) { return value == 0; } public boolean isZero(Integer value) { return value != null && value == 0; }
在大多数情况下,第一个版本适用,但如果value参数为null,则将NullPointerException引发a。
在第二个版本中,我们添加了“防护”测试。的value != null && value == 0表达是通过首先进行评价value != null试验。如果null测试成功(即结果为true),则对value == 0表达式进行求值。如果null测试失败,则value == 0跳过的评估(短路),而我们没有得到NullPointerException。
以下示例显示了如何&&避免使用相对昂贵的计算:
public boolean verify(int value, boolean needPrime) { return !needPrime | isPrime(value); } public boolean verify(int value, boolean needPrime) { return !needPrime || isPrime(value); }
在第一个版本中,|将始终对的两个操作数进行求值,因此isPrime将不必要地调用(expensive)方法。第二个版本通过使用||代替来避免不必要的调用|。