陷阱 - 用于测试布尔值

有时新的 Java 程序员会编写如下代码:

public void check(boolean ok) {
    if (ok == true) {           // Note 'ok == true'
        System.out.println("It is OK");
    }
}

一位经验丰富的程序员会发现它很笨拙,并希望将其重写为:

public void check(boolean ok) {
    if (ok) {
       System.out.println("It is OK");
    }
}

然而,ok == true 比简单的笨拙更加错误。考虑这种变化:

public void check(boolean ok) {
    if (ok = true) {           // Oooops!
        System.out.println("It is OK");
    }
}

这里的程序员错误输入了 == 作为 = …现在代码有一个微妙的 bug。表达 x = true 无条件地将 true 分配给 x 然后评估为 true。换句话说,无论参数是什么,check 方法现在都会打印没关系

这里的教训是摆脱使用 == false== true 的习惯。除了冗长之外,它们还使你的编码更容易出错。

注意:避免陷阱的 ok == true 的可能替代方案是使用 Yoda 条件 ; 即将文字放在关系运算符的左侧,如 true == ok。这有效,但大多数程序员可能会同意 Yoda 条件看起来很奇怪。当然,ok(或 !ok)更简洁,更自然。