怎样在 Java 代码中落实关联、聚合和组合?
查看完整题解
参考回答
直接回答
这些关系最终常以引用和方法调用实现,但区别靠业务约束落实:普通关联允许对象相互协作;聚合保留部件独立存在或共享的能力;组合需要限制部件归属,让整体负责部件的创建、变更和移除。字段的类型、final 修饰或 new 的位置都不能单独证明关系。
讲清原理
以订单明细为例,若明细由订单内部创建,不提供把现有明细挂到任意订单的入口,也不泄露可随意改写的列表,就更容易保持组合约束。聚合则可能接收已有对象引用,例如多份书单共享同一本图书的目录对象。
这里的“拥有”是业务和模型语义。Java 的垃圾回收看可达性,不识别 UML 菱形;资源清理也仍要依靠明确的关闭机制。
例子与易错点
class Order {
private static final class Line {}
private final java.util.List<Line> lines = new java.util.ArrayList<>();
void addLine() { lines.add(new Line()); }
int size() { return lines.size(); }
}
Order order = new Order();
order.addLine();
System.out.println(order.size()); // 1
这段代码展示封装创建入口,不是完整的订单模型。若把内部可变列表直接返回,外部仍可能绕开规则。设计关系要检查可操作的约束,不能只给字段加一句“这是组合”的注释。
相关题:第 1 题、第 11 题、第 15 题、第 17 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。