條件和條件或運算子(和)
Java 提供了條件和條件或運算子,它們都採用 boolean
型別的一個或兩個運算元並生成 boolean
結果。這些是:
-
&&
- 條件 AND 運算子, -
||
- 條件 OR 運算子。<left-expr> && <right-expr>
的評估等同於以下虛擬碼:{ boolean L = evaluate(<left-expr>); if (L) { return evaluate(<right-expr>); } else { // short-circuit the evaluation of the 2nd operand expression return false; } }
<left-expr> || <right-expr>
的評估等同於以下虛擬碼:
{
boolean L = evaluate(<left-expr>);
if (!L) {
return evaluate(<right-expr>);
} else {
// short-circuit the evaluation of the 2nd operand expression
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
。
在第二個版本中,我們新增了一個後衛測試。通過首先進行 value != null
測試來評估 value != null && value == 0
表達。如果 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
方法。第二個版本通過使用||
而不是|
來避免不必要的呼叫。