Java中的“Boolean.TRUE.equals(x)”有什么原因吗?

问题描述 投票:0回答:5

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

(这是Java语言)

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

Foo#isBar() 被定义为

boolean isBar()
,所以它不能返回
null

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

if (foo.isBar())

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

谢谢

java boolean-expression
5个回答
41
投票

我希望

foo.isBar()
返回一个布尔值。在这种情况下,您可以随时写
if (foo.isBar())
。 如果您的
foo.isBar()
返回
Boolean
,那么它可以是
Boolean.TRUE
Boolean.FALSE
NULL
。在这种情况下,
if (Boolean.TRUE.equals(foo.isBar()))
确保 if 块在一个场景中执行(TRUE),并在剩余的 2 个场景中省略。

以上

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


28
投票

由于

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


8
投票

我会怀疑“没有充分理由的旧遗留代码” - 事实上,我认为它是更糟糕。 (我想知道

int
是如何比较的..)

使用

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


我知道的唯一原因是

foo.isBar
was 是否被输入为返回
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;

-1
投票

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

当装箱类型 java.lang.Boolean 用作表达式时,如果值为

NullPointerException
(如
Java 语言规范 §5.1.8 拆箱转换
中定义),则会抛出 null

完全避免此类转换并显式处理 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
}

-4
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.