Object类不提供属性拷贝或校验能力,需借助BeanUtils(浅拷贝)、重写equals/hashCode、Jakarta校验框架等实现;深拷贝和复杂校验应选用专用工具或定制逻辑。

Java 中 Object 类本身**不提供对象属性拷贝或校验能力**,它只定义了如 equals()、hashCode()、toString() 等基础方法。通用的属性拷贝与校验需借助其他机制实现,不能直接靠继承 Object 完成。
使用 BeanUtils 工具类做浅拷贝
Apache Commons BeanUtils 或 Spring 的 BeanUtils.copyProperties() 是最常用的属性拷贝方式,它们通过反射读取 getter/setter 自动复制同名属性:
- 要求源和目标类属性名、类型兼容(或可转换),且有标准的 JavaBean 规范(public 无参构造 + getter/setter)
- Spring 版本默认忽略 null 值;Commons 版本默认覆盖 null,可通过
ConvertUtils.register()扩展类型转换 - 注意:仅支持**浅拷贝**,嵌套对象引用被直接复制,不会递归拷贝
手动重写 equals() 和 hashCode() 实现基础校验逻辑
Object.equals() 默认比较引用,若需按属性值判断相等性,必须在具体类中重写:
- 用
Objects.equals(a, b)安全比较字段(自动处理 null) - 重写
hashCode()时,参与计算的字段必须与equals()中一致,否则违反契约 - IDE(如 IntelliJ)可自动生成,但需确认是否包含所有业务相关字段(例如排除 createTime 等非业务标识字段)
用校验框架(如 Jakarta Bean Validation)做声明式校验
对对象状态做通用校验,推荐使用注解驱动方式,而非在 Object 层硬编码:
立即学习“Java免费学习笔记(深入)”;
- 在字段上添加
@NotNull、@Size、@Pattern等约束注解 - 通过
Validator.validate(obj)统一触发校验,返回Set<constraintviolation>></constraintviolation> - 支持分组校验、级联校验(
@Valid修饰嵌套对象),比手写 if-else 更可维护
需要深拷贝或复杂校验时考虑专用工具或定制逻辑
当浅拷贝或注解校验无法满足需求时:
- 深拷贝可用
SerializationUtils.clone()(要求对象可序列化),或使用 MapStruct、ModelMapper 等代码生成/映射框架 - 业务级校验(如“结束时间不能早于开始时间”)适合写在
@AssertTrue方法中,或封装为独立的Validator类 - 避免在
Object子类中泛化校验逻辑——应面向具体领域模型设计校验规则


















