java - 组合与聚合在代码上有何不同?

标签 java jakarta-ee

我一直在阅读有关组合和聚合的内容。我想我了解两种不同关系类型的基础。然而,它在代码中的实际外观仍然不清楚。

如果您有一个复合对象,是否意味着您永远不会在正在定义的复合对象之外编写 new OtherObject()?您从不将 OtherObject 类型的引用传递给复合对象,它是在内部维护的吗?

在所有传递引用的情况下,您处理的不再是组合而是聚合,这对吗?两者之间的界限在哪里?我不明白什么时候允许谈论属于组合物的对象而不是属于组合物的对象的规则。

最佳答案

Composition is a strong association.

Aggregation is a weak association.

聚合 是关联的一个特例。对象之间的定向关联。当一个对象“拥有”另一个对象时,您就得到了它们之间的聚合。它们之间的方向指定了哪个对象包含另一个对象。

组合 是聚合的一个特例。以更具体的方式,受限制的聚合称为组合。当一个对象包含另一个对象时,如果没有容器对象的存在,所包含的对象就不可能存在,则称为组合。

组合是一个关联,其中包含对象 b 负责包含对象 a 的生命周期。如果将已创建对象 a 的引用传递给另一个对象 b ,则 b 无法控制 的生命周期>a 。这意味着 a 即使没有 b 也可以存在。

class A {
   B b ;
   A(B b ) { this.b = b; }
 }

这里b的存在不依赖于a,但是A确实包含了B的对象.聚合

class A {
 B b ;
 A() { b = new B();}
}

这里 b 依赖于 A 对象的存在。如果没有 A 的对象,则也没有 B 的对象。 组成。

关于java - 组合与聚合在代码上有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17468348/

相关文章:

java - 如何使用 Okta 对用户进行身份验证而不重定向到 Okta 登录

java - J2EE 7 Rest 客户端中的属性而不是值

jakarta-ee - 数组作为 Struts 2 中的获取参数

Web 层和 EJB 层之间的 Java EE session 管理

java - Java 10 及更高版本的 Maven 编译器设置

java - 性能问题 : "java.text.MessageFormat.format" vs "StringBuilder"

java - 无法通过拖动调整 JTable 列的大小

java - 如何继承带注解的 Hibernate 过滤器?

java - Java EE 应用程序中的线程

java - 静态字段和方法