实体类中用包装类型代替基本类型,是为了准确表达“缺失”状态、兼容主流框架、避免默认值歧义及支持严谨空值校验。
实体类中用包装类型(如 Integer、Long、Boolean)代替基本类型(如 int、long、boolean),不是为了炫技,而是为了解决实际开发中几个关键痛点。优势主要体现在数据语义、框架兼容和运行安全三方面。
数据库字段允许为 NULL,而 HTTP 请求参数可能完全不传。如果实体类字段用 int age,当查库返回 null 或前端没提交 age 字段时,JDBC 或 Spring MVC 会尝试把 null 拆箱成 int,直接抛出 NullPointerException。而用 Integer age 可自然承接 null,后续可通过判空明确区分“年龄为 0”和“年龄未知”两种业务含义。
Spring MVC 绑定表单、MyBatis 映射查询结果、Jackson 解析 JSON 等场景,默认都按对象方式处理字段。例如:
NULL,它会设为 Integer 的 null,而非强制填默认值 0;{"name":"张三"} 中没带 "age" 字段,Integer age 保持 null,int age 则被设为 0(错误语义);List<User> 或 Map<String, Integer> 无法使用基本类型,包装类是唯一选择。基本类型有强制默认值(int 是 0,boolean 是 false),容易掩盖真实业务状态。比如:
立即学习“Java免费学习笔记(深入)”;
String phone 是 null,但若误用 long phoneNum,就会变成 0 —— 系统可能误判为“手机号为 0 的用户”,造成校验绕过或逻辑错乱;int status,默认值 0 可能被误认为“已创建”,而实际应是“未初始化”;用 Integer status,null 更清晰表达“尚未赋值”。包装类型配合注解(如 @NotNull、@Min(1))可精准控制字段是否允许为空、取值范围等。例如:
@NotNull private Integer price; 明确要求价格必须提供;@Min(1) private Integer quantity; 既能校验非空,又能确保大于 0;int quantity 即使加了 @Min(1),也会因默认值 0 导致校验失败或逻辑异常。