必须使用包装类型,因基本类型有隐式默认值(如int=0),无法区分“未赋值”与“有效值”,易导致npe、数据库误入库、业务语义错误及校验失效;包装类型(integer等)以null显式表达缺值,适配数据库null、json可选字段、rpc异常场景,保障系统健壮性。

实体类和DTO中属性必须用包装类型,基本类型不适合。
阿里巴巴规范明确强制要求
《阿里巴巴Java开发手册》规定:
- 所有POJO类属性必须使用包装数据类型(如Integer、Long、Boolean、String等);
- RPC方法的返回值和参数也必须使用包装类型;
- DO/DTO/VO等传输类,禁止给属性设默认值;
- 局部变量才推荐用基本类型(因作用域小、语义明确、无null风险)。
为什么不能用基本类型
核心在于业务语义失真和运行时风险:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 数据库字段允许NULL,MyBatis查出来是null → 若用int接收,自动拆箱触发NullPointerException;
- 前端JSON传参可能缺字段(如{"name":"李四"}没带"age")→ Spring MVC绑定int age会设为0,误判“年龄为0”而非“未填写”;
- 订单状态status用int,默认值0可能被当成“已创建”,而实际应是“未初始化”;用Integer status为null,语义更准确;
- @NotNull、@Min(1)等校验注解对int无效——它永远有默认值,校验形同虚设。
包装类型带来的实际好处
不只是“能存null”,更是系统健壮性的基础设计:
- 与框架天然兼容:Jackson解析、MyBatis映射、Spring参数绑定都按对象处理,null可原样传递;
- 支持泛型:List
合法,List 编译直接报错; - 区分业务状态:“手机号为空”(null)≠“手机号是0”(非法但能存);
- 远程调用失败时,返回Integer null可展示“—”或提示重试,而int只能返回0,造成误导(如显示“成交涨跌0%”实为调用异常)。
什么场景可以用基本类型
仅限明确非null、生命周期短、纯计算用途:
- for循环中的计数器:for (int i = 0; i
- 方法内临时计算:int total = price * quantity;
- 常量定义:public static final int MAX_RETRY = 3;
- 增删改操作的返回行数:int result = userMapper.delete(id);——它必为非负整数,语义清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










