同一类的Java组合和聚合?

Posted

技术标签:

【中文标题】同一类的Java组合和聚合?【英文标题】:Java Composition and Aggregation at same class? 【发布时间】:2015-03-10 19:52:43 【问题描述】:

假设我们有两个名为 Point 和 Line 的类。 Line 类有两个构造函数。这是Point类的代码。

// The Point class definition
public class Point 
   // Private member variables
   private int x, y;   // (x, y) co-ordinates

   // Constructors
   public Point(int x, int y) 
      this.x = x;
      this.y = y;
   
   public Point()     // default (no-arg) constructor
      x = 0;
      y = 0;
   
    

这是 Line 类的代码。

public class Line 
   // Private member variables
   Point begin, end;   // Declare begin and end as instances of Point

   // Constructors
   public Line(int x1, int y1, int x2, int y2) 
      begin = new Point(x1, y1);  
      end   = new Point(x2, y2);
   `
   public Line(Point begin, Point end) 
      this.begin = begin;
      this.end   = end;
   

如你所见 Line 类有两个构造函数。第一个构造函数是 Compositon 的示例,而第二个构造函数是聚合的示例。现在,对于这个案例,我们能说些什么呢?一个类可以同时具有聚合和组合吗?感谢您的回答。

【问题讨论】:

Implementation difference between Aggregation and Composition in Java 的可能重复项 【参考方案1】:

对于聚合和组合之间差异的普遍接受的定义是终身责任和所有权。

聚合:对象A 持有对其他对象的引用,但那些其他对象与其他类共享。当A 被释放时,其他对象继续存在并在应用程序中使用 组成:对象B 是由其他对象“组成”的。当 A 被释放时,其他对象也会被释放。

值得quoting Fowler on this:

UML 中很少有东西比聚合和组合更令人震惊

...

聚合(白色菱形)没有超出常规关联的语义。正如 Jim Rumbaugh 所说,它是一种建模安慰剂

...

组合(黑色菱形)确实带有语义。最特别的是一个对象只能是一个组合关系的一部分

所以是的,一个类可以与它所引用的对象同时具有组合和聚合关系,但可能与您展示的示例不同。

【讨论】:

【参考方案2】:

由于组合(相对于聚合)的定义特征是具有独占/不可共享部分(请参阅https://***.com/a/27889087/2795909),您的Point-Line 部分-整体关系示例显然是一个聚合(无论如果您将点对象传递给构造函数或在构造函数中创建它们),因为定义一条线的两个点可以与其他线共享。

【讨论】:

以上是关于同一类的Java组合和聚合?的主要内容,如果未能解决你的问题,请参考以下文章

java--依赖关联聚合和组合之间区别的理解

java--依赖关联聚合和组合之间区别的理解

java怎么理解组合/聚合关系给个例子最好能将细点

C++类的组合和聚合

UML类图(下):关联聚合组合依赖

桥接模式