29

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

(这是在 Java 中)

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

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

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

if (foo.isBar())

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

谢谢

4

6 回答 6

31

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

当返回布尔 NULL时,以上if (foo.isBar()) 将失败。 foo.isBar()

于 2012-10-08T04:01:40.267 回答
21

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

于 2012-10-08T04:10:14.463 回答
5

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

使用的代码TRUE.equals需要一个装箱转换,一个额外的方法调用(以及里面的所有东西),最后,它看起来很草率


我知道的唯一原因是 iffoo.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;
于 2012-10-08T03:58:23.750 回答
1

有些人认为(我自己不是其中之一)过于明确会使布尔条件更具可读性。例如使用

if(foo == true)代替if(foo)

也许这是一个类似的案例?

于 2012-10-08T04:04:31.080 回答
0

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

当盒装类型 java.lang.Boolean 用作表达式时,NullPointerException如果该值与Java 语言规范 §5.1.8 Unboxing Conversionnull中定义的值相同,它将抛出。

完全避免这种转换并显式处理空值会更安全。

不合规代码示例

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
}
于 2021-11-16T13:19:30.293 回答
-3

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

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

于 2012-10-08T03:56:34.970 回答