陷阱 - 使用 Yoda 表示法来避免 NullPointerException

StackOverflow 上发布的很多示例代码包括这样的代码段:

if ("A".equals(someString)) {
    // do something
}

someStringnull 的情况下,这确实防止避免可能的 NullPointerException。此外,有争议的是

    "A".equals(someString)

比以下更好:

    someString != null && someString.equals("A")

(它更简洁,在某些情况下它可能更有效。但是,正如我们在下面提到的那样,简洁可能是负面的。)

然而,真正的陷阱是使用 Yoda 测试来避免 NullPointerExceptions 作为习惯问题。

当你写 "A".equals(someString) 时,你实际上是做得好的情况下,someString 恰好是 null。但另一个例子( 陷阱 - 制造好意外的零点 )解释说,制作好null 值可能因各种原因而有害。

这意味着尤达的条件不是最佳实践 1 。除非预期 null,否则最好让 NullPointerException 发生,以便你可以获得单元测试失败(或错误报告)。这允许你查找并修复导致意外/不需要的 null 出现的错误。

Yoda 条件仅应用于预期 null 的情况,因为你正在测试的对象来自一个记录为返回 null 的 API。并且可以说,使用表达测试的一种不那么漂亮的方式可能会更好,因为这有助于向正在审查你的代码的人强调 null 测试。

1 - 根据维基百科“最佳编码实践是软件开发社区随着时间的推移学到的一套非正式规则,可以帮助提高软件质量。” 。使用 Yoda 表示法并不能实现这一点。在很多情况下,它会使代码变得更糟。