Java基础 | 基本类型与引用类型使用规范

前言

虽然自动装箱 / 拆箱可实现类型混用,但会产生不必要的性能损耗。
应按场景精准选择类型,避免依赖该机制。

一、核心原则(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 项目开发的基础规范。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值