Java基础 | 基本类型与引用类型使用规范
Java基础 | 基本类型与引用类型使用规范
- 前言
- 一、核心原则(4大准则)
- 二、快速查询表(场景-类型对应)
- 三、核心使用规范(分类型明细)
- 1. 引用类型(适配null场景)
- 场景1:数据库实体类(POJO/DO)
- 场景2:Mapper接口入参
- 场景3:数据传输对象(DTO/VO)
- 场景4:业务层单字段查询返回
- 场景5:框架参数校验/JSON序列化
- 2. 基本类型(适配非null场景)
- 场景1:Mapper接口返回受影响行数
- 场景2:局部计算/临时变量
- 场景3:明确非null的业务参数
- 场景4:常量/固定值定义
- 四、特殊场景处理建议
前言
虽然自动装箱 / 拆箱可实现类型混用,但会产生不必要的性能损耗。
应按场景精准选择类型,避免依赖该机制。
一、核心原则(4大准则)
- 安全优先:数据存储/流转场景,优先规避null值风险
- 效率适配:局部计算/明确非null场景,兼顾性能轻量化
- 统一一致:项目内遵循同一标准,不混用水准
- 语义贴合:类型选择匹配业务场景,见类型知用途
二、快速查询表(场景-类型对应)
| 应用场景 | 推荐类型 | 核心依据 |
|---|---|---|
| POJO/DO实体类属性 | 引用类型 | 兼容数据库null值 |
| Mapper接口入参 | 引用类型 | 匹配实体类,防转换异常 |
| DTO/VO传输对象 | 引用类型 | 适配接口可选字段 |
| 单字段查询返回 | 引用类型 | 区分“无结果”和默认值 |
| 增删改返回行数 | 基本类型int | 非null整数,语义直观 |
| 局部计算/循环 | 基本类型 | 轻量化,无装箱冗余 |
| 必传业务参数 | 基本类型 | 明确非null,简洁高效 |
| 常量定义 | 基本类型 | 固定值,无null风险 |
三、核心使用规范(分类型明细)
1. 引用类型(适配null场景)
场景1:数据库实体类(POJO/DO)
- 规范:全字段强制使用引用类型
- 正确示例:
private Integer userId; // 主键ID(可能为null,如未保存时)
private Boolean isActive; // 状态(可能未设置)
private String userName; // 用户名(字符串本身为引用类型)
- 错误示例:
private int userId; private boolean isActive; - 关键说明:兼容数据库字段null值,避免查询/存储时抛出空指针异常
场景2:Mapper接口入参
- 规范:与实体类属性类型保持一致,优先用引用类型
- 正确示例:
List<User> queryUser(Integer id, String userName); // id可为null(查全部)
- 错误示例:
List<User> queryUser(int id, String userName); - 关键说明:防止传入null时触发基本类型自动转换异常
场景3:数据传输对象(DTO/VO)
- 规范:所有属性统一用引用类型
- 正确示例:
public class UserVO {private Integer age; // 年龄(可选字段)private Boolean isVip; // VIP状态(可能未开通)private Date createTime;// 创建时间(可能未赋值)
}
- 错误示例:
private int age; private boolean isVip; - 关键说明:明确区分“未传值”(null)和“默认值”,适配接口传输场景
场景4:业务层单字段查询返回
- 规范:查询单个字段时用引用类型
- 正确示例:
Integer getUserAge(Long userId); // 用户不存在时返回null
Boolean checkVipStatus(Long userId); // 未查询到时返回null
- 错误示例:
int getUserAge(Long userId); boolean checkVipStatus(Long userId); - 关键说明:避免用默认值(0/false)掩盖“查询无结果”的业务语义
场景5:框架参数校验/JSON序列化
- 规范:需区分null和默认值时,用引用类型
- 正确示例:
@NotNull Integer status; // 校验“必须传值”,null则触发校验失败
@Min(1) Integer count; // 最小值1,null不触发(可选字段)
- 错误示例:
@NotNull int status; @Min(1) int count; - 关键说明:框架可精准识别“未传值”和“传默认值”,校验逻辑更严谨
2. 基本类型(适配非null场景)
场景1:Mapper接口返回受影响行数
- 规范:增删改操作返回行数用int
- 正确示例:
int saveOrder(Order order); // 返回插入成功的行数(必为非null)
int deleteUserById(Long id); // 返回删除成功的行数
- 错误示例:
Integer saveOrder(Order order); - 关键说明:MyBatis等框架返回行数必为整数,int语义更直观,无性能损耗
场景2:局部计算/临时变量
- 规范:方法内临时计算、循环计数等用基本类型
- 正确示例:
int sum = a + b; // 两数求和(无null风险)
double totalAmount = price * quantity; // 金额计算
int i = 0; for(; i < list.size(); i++) {} // 循环计数
- 错误示例:
Integer sum = a + b; Double totalAmount = price * quantity; - 关键说明:避免装箱拆箱冗余,提升计算效率
场景3:明确非null的业务参数
- 规范:必填、固定值参数用基本类型
- 正确示例:
int pageNum = 1; // 页码(必传,最小为1)
int pageSize = 10; // 每页条数(固定可选值)
int phoneLength = 11; // 手机号长度(固定规则)
- 错误示例:
Integer pageNum = 1; Integer phoneLength = 11; - 关键说明:业务上明确非null,用基本类型更简洁
场景4:常量/固定值定义
- 规范:常量定义优先用基本类型
- 正确示例:
public static final int MAX_SIZE = 100; // 最大容量(固定值)
public static final boolean DEFAULT_FLAG = true; // 默认状态
- 错误示例:
public static final Integer MAX_SIZE = 100; - 关键说明:常量无null场景,基本类型更符合语义
四、特殊场景处理建议
- 非空约束+业务强制非null:可使用基本类型,但需团队书面确认并备注
- 框架兼容优先:MyBatis-Plus、Spring Validation等框架有明确要求时,遵循框架规范
- 避免过度包装:局部变量无需刻意用引用类型,防止性能浪费
- 避免依赖自动装箱拆箱:该机制虽简化编码,但会隐性消耗性能,非必要场景坚决不用。
- 团队规范至上:已有项目规范优先,不单独打破统一标准
引用类型的核心是“安全兼容”,覆盖数据存储、流转等可能出现null的场景;
基本类型的核心是“高效简洁”,适用于明确非null的局部计算、常量等场景。
按场景精准选择,既能减少空指针异常,又能避免自动装箱拆箱带来的性能损耗,是 Java 项目开发的基础规范。
