必须使用包装类型,因基本类型有隐式默认值(如int=0、boolean=false),无法区分“未赋值”与“有效值”,易致NPE、数据库误入库及业务语义错误;包装类型以null显式表达缺值,适配数据库NULL、JSON可选字段和RPC异常场景。

实体类属性必须用包装类型,不能用基本类型。
为什么必须用包装类型
基本类型有隐式默认值(比如 int 默认是 0、boolean 默认是 false),无法区分“字段未传值”和“传了有效值”这两种语义。例如数据库里 is_deleted 字段为 NULL,用 boolean 就只能是 false,业务上可能误判为“未删除”;JSON 反序列化时缺失字段,基本类型会自动填充默认值,掩盖真实空缺状态;RPC 调用返回 null 时,基本类型拆箱直接抛 NPE。
- 包装类型(Integer、Boolean、Long 等)用 null 显式表达“缺值”,与数据库 NULL、HTTP 请求可选字段、远程调用异常场景天然对齐
- 所有 POJO 类(包括 DTO、VO、DO、BO)都适用该规则
- 只有局部变量才推荐用基本类型——作用域小、无 null 风险、性能更优
字段定义具体规范
数据库映射字段要严格对应包装类型:
- TINYINT(1) 或 BIT 类型的布尔字段 → 用 Boolean,不要用 boolean
- 金额类数值 → 必须用 BigDecimal,避免浮点精度问题
- 整型主键或数量 → 用 Long 或 Integer,不用 long/int
- 字符串统一用 String,不使用 char[] 或自定义字符容器
配套结构不能少
只改类型还不够,完整实体类需满足基础工程规范:
立即学习“Java免费学习笔记(深入)”;
- 实现 Serializable 接口,并显式声明 serialVersionUID(如
private static final long serialVersionUID = 1L;) - 所有字段 private,禁止 public 或 protected
- 提供 无参构造器(MyBatis、Jackson 等框架依赖它实例化对象)
- 提供 全参构造器,参数顺序与字段声明顺序一致;字段超过 4 个建议用 Builder 模式
- getter/setter 严格遵循 JavaBeans 规范:布尔字段 getter 必须是
isXxx(),不能是getXxx()
常见错误要避开
这些写法看似能跑通,但在线上容易引发隐蔽问题:
- 给 DTO/VO 字段设默认值(如
private Integer status = 0;)——违反阿里规范,破坏空值语义 - 用 Lombok 的
@AllArgsConstructor自动生成全参构造器——字段增减后易漏参,状态不一致 - 在 setter 中做复杂逻辑(如远程调用、DB 查询)——破坏数据封装性,影响序列化和批量操作
- 重写
equals/hashCode时只基于部分字段——集合操作出错,缓存 key 错乱


















