何时应使用布尔值的空值?

2022-08-31 07:11:15

Java 允许 和 的值,而布尔值允许 、 和 。我已经开始将我的s转换为s。这可能会导致测试崩溃,例如booleantruefalsetruefalsenullbooleanBoolean

Boolean set = null;
...
if (set) ...

在测试时

if (set != null && set) ...

似乎是人为的,容易出错。

什么时候(如果有的话)使用带有空值的 s 有用?如果从不,那么包装对象的主要优点是什么?Boolean

更新:有很多有价值的答案,我已经在自己的答案中总结了其中的一些。我充其量只是Java的中级,所以我试图展示我发现有用的东西。请注意,这个问题是“措辞不正确”(布尔值不能“具有空值”),但我保留了它,以防其他人有同样的误解


答案 1

使用而不是每次都使用。这将避免许多 s,并使你的代码更加健壮。booleanBooleanNullPointerException

Boolean很有用,例如

  • 将布尔值存储在集合中(列表、地图等)
  • 表示可为 null 的布尔值(例如,来自数据库中的可为 null 的布尔列)。在此上下文中,null 值可能意味着“我们不知道它是真的还是假的”。
  • 每次方法都需要 Object 作为参数,并且需要传递一个布尔值。例如,当使用反射或方法(如 .MessageFormat.format()

答案 2

我几乎从不使用,因为它的语义模糊不清。基本上你有3态逻辑:真,假或未知。有时使用它很有用,例如,您让用户在两个值之间进行选择,而用户根本没有回答,并且您确实想知道该信息(例如:NULLable数据库列)。Boolean

我认为没有理由从转换为,因为它引入了额外的内存开销,NPE可能性和更少的键入。通常,我使用笨拙的 BooleanUtils.isTrue() 来使我的生活更轻松一些。booleanBooleanBoolean

存在的唯一原因是能够拥有类型的集合(泛型不允许,以及所有其他基元)。BooleanBooleanboolean