构造函数是确保对象初始状态合法的唯一可靠入口,必填属性须在构造时校验并赋值,配合final字段、防御性拷贝、静态工厂及工具链注解强化契约。

关键不是“填字段”,而是让对象一出生就满足业务可用的前提条件。构造函数是强制执行这一契约的唯一可靠入口。
必填属性必须在构造时校验,且校验要早于赋值
一旦字段被写入,哪怕后续抛异常,对象内部状态已部分污染。正确顺序是:先检查,再赋值。
- 用 Objects.requireNonNull(name, "name must not be null") 拦截空引用,比 setter 中判空更彻底
- 数值类约束写在开头:if (age 150) throw new IllegalArgumentException("age out of valid range")
- 枚举或状态码用 Set.of(Status.ACTIVE, Status.INACTIVE).contains(status) 提前验证,不合法直接失败
用 final 字段 + 构造注入锁定不可变性
声明为 private final String name; 后,它只能在构造函数中被赋值一次。这从语言层面杜绝了后续被设为 null 或覆盖的风险。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 所有必填字段都应声明为 final,避免后期被意外修改
- 集合类属性初始化为空集合而非 null:private final List
roles = new ArrayList(); - 若需外部传入集合,务必做防御性拷贝:this.roles = new ArrayList(inputRoles);
复杂校验交给静态工厂,构造函数保持轻量可测
当必填逻辑涉及远程调用、数据库查询或事务协调时,构造函数无法安全回滚。此时应退守为私有构造 + 公共静态工厂。
- 把构造函数设为 private,禁止 new User(...)
- 提供 public static User create(String email, String password) 方法,在其中完成邮箱唯一性校验、密码强度检查等
- 工厂方法可统一处理异常包装、日志记录和指标上报,也便于在测试中模拟各种失败分支
工具链辅助强化契约表达
光靠代码逻辑还不够,要用类型系统和工具把“必填”变成可检查、可传播的契约。
- 字段加 @NonNull 注解(如 Lombok 的 @RequiredArgsConstructor),配合 IDE 实时提示
- DTO 类启用 Jackson 的 @JsonInclude(JsonInclude.Include.NON_NULL),避免前端收到 null 字段后自行补空逻辑
- API 文档明确写出:User.create(...) 返回 User 实例,参数 email 和 password 均为必填,缺失任一则抛 IllegalArgumentException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










