数据传输对象(DTO)中什么时候用int,什么时候用Integer
@Data
public class DishPageQueryDTO implements Serializable {private int page;private int pageSize;private String name;//分类idprivate Integer categoryId;//状态 0表示禁用 1表示启用private Integer status;}
代码中为什么有的属性用int,有的属性用Integer
这是一个非常常见、也非常重要的 Java 基础问题,核心原因只有一句话:
int 是基本类型,Integer 是包装类型;当字段需要“null 语义”时必须用包装类型。
下面把你在 DTO 里看到的两种写法逐条拆开说明:
字段 | 类型 | 为什么这样选 |
---|---|---|
page | int | 分页查询里“第几页”属于强制必须的参数,业务上不允许为空,用 int 可以强制调用方必传(不传框架也会给默认值 0),而且省一点内存。 |
pageSize | int | 同上,“每页条数”也是强制必须,通常>0,用 int 同样可以避免 null。 |
name | String | 字符串没有基本类型,只能写 String; nullable 查询条件,传 null 代表“不按名字过滤”。 |
categoryId | Integer | 查询条件里“分类 id”是可选的,传 null 代表“不限分类”。如果写成 int,null 会被强转成 0,就把“不限”误伤成“只查分类 0”了。 |
status | Integer | 与 categoryId 同理,0 代表禁用,1 代表启用,null 代表“不限状态”。用 int 会把 null 变 0,查询就永远只能查出禁用的数据。 |
一句话总结
“只要这个字段在业务上需要表达‘没传’、‘不限’、‘未知’这三种含义,就必须用包装类型(Integer/String/Double…);否则可以用基本类型(int/double/char…)。”
额外注意点
- 数据库里字段允许 NULL,对应的 Java 实体类也必须用包装类型,否则 ORM 在映射时会抛 “Null value was assigned to a property of primitive type” 异常。
- 布尔标志推荐用 Boolean 而不是 boolean,原因一样:需要区分“未设置”与“true/false”。
- 在 DTO/VO 里尽量保持包装类型,可以少踩很多空指针和类型转换的坑;基本类型只在你绝对确定它不会为 null 的场景再用。