Java 中该用 Boolean 还是 boolean

51 阅读2分钟

这段时间开发时发现一个问题,Java 类中布尔类型的成员变量的类型应该用包装类型 Boolean 还是基本类型 boolean。

public class EpcPickImageQueryParam implements Serializable {
    String vinCode;
    String partsCode;
    Set<String> imageCodes;
    // boolean withLinkParts;
    // Boolean withLinkParts;
}

对于这个问题我们先来看看包装类型 Boolean 和基本类型 boolean 的一些区别,然后我们再来看看这些区别具体到项目工程设计中的应用。

Boolean 和 boolean 的区别

Booleanboolean
初始值NULLfalse
支持的取值NULL、true、falsetrue、false
性能损耗拆箱装箱操作
内存损耗16字节(对象存储)1字节(基本类型数据存储)

设计应用上的优势

业务场景需求

  1. 包装类型 Boolean 的取值有 NULL、true、false 三种,相当于可以提供三种布尔值的状态,例如「未设置/开启/关闭」,对于一些需要区分或标识「未知/未设置/可选的」状态的场景十分实用,使用 NULL 就可以标识。
  2. 相反的基本类型 boolean 就需要十分明确变量只会存在两种状态 true/false,如果场景规定只会有这两种状态或变量不能为空,那就非常实用,不需要引入一个 NULL 状态,以免产生歧义;需要特别注意的是变量默认值是 false,这个需要确认一下是否符合你自己的场景。

避免 NPE

  1. 包装类型 Boolean 可以接受 NULL 赋值,而 boolean 接受 NULL 赋值时会报错 NPE,所以如果成员变量有可能被传递 NULL 值时应该使用 Boolean 避免潜在的 NPE。
// 方法参数经常使用包装类型而非基本类型,避免传参时隐蔽 NPE 的发生。
Integer groupId = null;
public void encryptImageCode(Boolean groupId, String pureImageCode){ //... }

而如果是明确的只会存在两种状态 true/false 的变量,使用时就尽量基本类型 boolean 因为可以省去进行 null 检查操作,代码更加简洁。

内存和性能

包装类型 Boolean 的占用空间会比基本类型 boolean 大很多,且存在装箱拆箱的性能损耗,如果追求性能的场景还是考虑选择 boolean。

外部系统交互

如果该变量用于与外表系统交互(例如将会被序列化传递或作为参数类传递),那么包装类型 Boolean 还是支持传递 NULL 值,充当未设置或不存在该内容的语义;而基本类型只会传递 true/false。