如何比较布尔值?

新手上路,请多包涵

以此为例(摘自 Java regex checker not working ):

 while(!checker) {
    matcher = pattern.matcher(number);
    if(matcher.find())
        checker = true;
    else
        year++;
}

如果使用 .equals(false) 来检查 Boolean checker 的值是否重要?

我知道有 这个 很相似。但是,显然问题涉及原始 boolean 而不是对象包装器 Boolean ;因此, .equals() 将不适用。

另外,应该 Boolean 的处理方式不同于 boolean 吗?

原文由 ylun.ca 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 583
2 个回答

从您的评论来看,您似乎正在寻找使用 Boolean 包装类的“最佳实践”。但是确实 没有 任何最佳实践,因为一开始就使用这个类不是一个好主意。使用对象包装器的唯一原因是在您绝对 必须 的情况下(例如当使用 Generics 时,即,将 boolean 存储在 HashMap<String, Boolean> 等中)。使用对象包装器没有好处,也有很多缺点,最值得注意的是,它会让你打开 NullPointerException s。

如果’!’有关系吗?用于布尔值而不是 .equals()?

这两种技术都容易受到 NullPointerException 的影响,因此在这方面无关紧要。在第一种情况下, Boolean 将被 拆箱 到其各自的 boolean 值中并正常进行比较。在第二种情况下,您从 Boolean 类中调用一个方法, 如下 所示:

 public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

无论哪种方式,结果都是一样的。

如果使用 .equals(false) 来检查布尔检查器的值是否重要?

根据以上,没有。

次要问题:布尔值的处理方式应该与布尔值不同吗?

如果您绝对 必须 使用 Boolean 类,请在执行任何比较之前始终检查 null 。例如,

 Map<String, Boolean> map = new HashMap<String, Boolean>();
//...stuff to populate the Map
Boolean value = map.get("someKey");
if(value != null && value) {
    //do stuff
}

这将起作用,因为 Java 短路了 条件评估。您还可以使用三元运算符。

 boolean easyToUseValue = value != null ? value : false;

但是说真的……只要使用原始类型,除非你被迫不这样做。

原文由 asteri 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试这个:

 if (Boolean.TRUE.equals(yourValue)) {
    // ...
}

作为额外的好处,这是空安全的。

原文由 yglodt 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题