在Java中"Boolean.TRUE.equals(x)"有什么原因吗?



我在我正在处理的一个项目中遇到了这段代码

(这是在爪哇中)

if (Boolean.TRUE.equals(foo.isBar()))

Foo#isBar() 被定义为 boolean isBar() ,所以它不能返回null

真的有什么理由应该这样写吗?我自己只会写

if (foo.isBar())

,但也许我错过了一些微妙的东西。

谢谢

我希望foo.isBar()返回一个布尔值。在这种情况下,您可以随时编写if (foo.isBar()) . 如果您foo.isBar()返回Boolean则它可以是 Boolean.TRUEBoolean.FALSENULL 。在这种情况下,if (Boolean.TRUE.equals(foo.isBar()))确保在一个场景中执行 if 块 (TRUE),并在其余 2 个场景中省略。

foo.isBar()返回布尔 NULL时,超出if (foo.isBar())将失败

由于isBar返回一个原始boolean,所以没有语义上的区别。此外,第二种方法更简洁、更清晰、更高效,因为结果不必为调用自动装箱,然后再次提取原始布尔值。鉴于所有这些,没有理由使用第一种方法,而有几个使用第二种方法,因此请使用第二种方法。 我给其他程序员很大的回旋余地,但我会坐下来和任何在专业代码中添加类似东西的人聊天。

我会怀疑"没有充分理由的旧遗留代码" - 事实上,我认为它更糟。(我想知道int是如何比较的.

使用TRUE.equals的代码需要装箱转换,额外的方法调用(以及内部的所有内容),最后,它看起来很草率


我知道的唯一原因是foo.isBar是否键入为返回Boolean(而不是boolean)以及它可能返回null

Boolean b = null;
// throws an exception when it tries to unbox b because it is null
boolean isTrue1 = (boolean)b;
// evaluates to false
boolean isTrue2 = Boolean.TRUE.equals(b);
// evaluates to false as well
boolean isTrue3 = b != null ? (boolean)b : false;

我是否发现这个实际示例对某人有用:

当盒装类型 java.lang.Boolean 用作表达式时,如果该值按照 Java 语言规范 §5.1.8 取消装箱转换中的定义null,它将抛出NullPointerException

完全避免此类转换并显式处理 null 值更安全。

不合规代码示例

Boolean b = getBoolean();
if (b) {  // Noncompliant, it will throw NPE when b == null
  foo();
} else {
  bar();
}

合规解决方案

Boolean b = getBoolean();
if (Boolean.TRUE.equals(b)) {
  foo();
} else {
  bar();  // will be invoked for both b == false and b == null
}

第一个条件下,您正在检查对应于 true 的布尔对象的相等性。你在代码中使用第一个条件,因为你的Java版本不支持自动拆箱,因此你需要使用布尔对象。

在Java中,Boolean.TRUE和true有什么区别?

最新更新