聚合关系中整体持有部分引用但不控制其生命周期,部分可独立创建、复用和共享;关键标志是部件由外部提供,通过构造器或Setter注入,且删除整体后部分仍可用。

Java 中通过聚合关系建立整体与部分,关键在于让“整体”持有“部分”的引用,但不控制其生命周期——部分对象可以独立创建、复用,甚至被多个整体共享。
明确整体与部分的语义边界
先从业务逻辑出发划分层级。比如表单系统中,Form 是整体,它包含多个 FieldGroup;每个 FieldGroup 是部分,又可包含多个 InputField;而 InputField 本身还可聚合 Validator 或 DefaultValue。每一层只管理自身职责,不越界干预下层对象的创建或销毁。
- Form 不 new FieldGroup,而是接收已构造好的实例
- FieldGroup 不 new InputField,而是通过 add(InputField) 接收外部传入的对象
- Validator 可被多个 InputField 共用,比如同一个 RequiredValidator 实例用于多个必填字段
用构造器或 Setter 注入部件,避免内部 new
聚合的核心标志是“部件由外部提供”。这直接体现在代码写法上:
- 在整体类(如 Form)的构造器中,参数应为 List<FieldGroup>,而不是在方法体内 new FieldGroup()
- 提供 public void addFieldGroup(FieldGroup group) 方法,允许动态添加已存在的部分对象
- 部分类(如 Employee)应能独立构造:new Employee("张三"),不依赖 Department 才能存在
确保部分对象可脱离整体独立存在
这是聚合区别于组合的关键判断依据。验证方式很简单:删除整体后,部分是否仍可用?
立即学习“Java免费学习笔记(深入)”;
- 班级(Department)被移除,学生(Employee)对象依然可以 new 出来、存入数据库、分配到其他部门
- 图书馆关闭,书(Book)对象仍可被借阅、转移到另一家图书馆
- 汽车(Car)报废,轮胎(Tire)还能装到别的车上——这就符合聚合;若轮胎只能随车销毁,则属于组合
配合接口抽象与安全封装提升复用性
聚合不是简单地加个字段,而是为松耦合和扩展留出空间:
- 定义 Validator 接口,让 EmailValidator、RangeValidator 等实现类互换,InputField 只依赖接口
- 对部分集合使用不可变包装或防御性拷贝:getGroups() 返回 Collections.unmodifiableList(list)
- 避免在整体类中暴露部分对象的 setter,防止外部绕过业务规则直接修改内部状态


















