繁体   English   中英

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

[英]Is there any reason for "Boolean.TRUE.equals(x)" in Java?

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

(这是在Java中)

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中省略。

超过 if (foo.isBar()) 将失败,当 foo.isBar() 返回Boolean NULL时。

由于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;

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

if(foo == true)而不是if(foo)

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

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

当装箱类型 java.lang.Boolean 用作表达式时,如果该值为Java Language Specification §5.1.8 Unboxing Conversion 中定义的null ,它将抛出NullPointerException

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

不合规的代码示例

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的Boolean对象是否相等。 并且您正在使用代码中的第一个条件,因为您的Java版本不支持自动装箱,因此您需要使用布尔对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM