组合与聚合的代码有何不同?

时间:2013-07-04 10:48:46

标签: java java-ee

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

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

您传递引用的所有情况是否正确,您不再处理合成而是聚合?两者之间的界限在哪里?我不明白你何时可以谈论作为作品一部分的对象的规则。

2 个答案:

答案 0 :(得分:4)

  

组合是一种强大的关联。

     

聚合是关联。

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

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

组合是一个关联,其中包含对象b负责所包含对象a的生命周期。如果将已创建的对象a的引用传递给另一个对象b,则b无法控制a的生命周期。这意味着{{1即使没有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的对象。的组合物。

答案 1 :(得分:0)

考虑以下

这是组合的示例。 B与A相关联,以便在没有A

的情况下不能存在
      Class A{
         B b = new B();
       }

如果你创建了类A的对象,那么也会创建B,如果A被销毁,那么B也会被销毁。

考虑聚合的示例。 B与A相关但可以与A

相关联
      Class A{
         C c = new C();
         B b = c.someMethodThatReturnsExistingBObject();
      }

      class C{
         B b = new B();
         public B someMethodThatReturnsExistingBObject(){
             return b;
         }
       }

然后这将返回一个具有外部引用的对象。即它仍然生活在这个班级之外。因此,即使A对象被破坏,B对象也将存在于外部。

您传递引用的所有情况是否正确,您不再处理合成而是聚合?

是的,因为组合的含义是对象没有任何外在存在。一旦传递引用,它将被视为aggregation,因为在传递引用时,您将外部对象传递给它,它将从外部存在,因为它是从外部传递的。