Java组合和聚合在同一个类?

时间:2015-01-12 23:07:20

标签: java constructor uml aggregation composition

考虑我们有两个名为Point and 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的示例,而第二个构造函数示例聚合。现在,我们可以对这个案子说些什么呢?一个类可以同时具有聚合和组合吗?谢谢你的回答。

2 个答案:

答案 0 :(得分:3)

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

  • 聚合:对象A保存对其他对象的引用,但其他对象与其他类共享。当处置A时,其他对象将继续存在并在应用程序中使用
  • 组合:对象B由其他对象“制作”。当A被处置时,其他对象也是如此。

值得quoting Fowler on this

  

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

     

...

     

聚合(白色菱形)没有超出常规关联的语义。就像Jim Rumbaugh所说的那样,它是一个模特安慰剂

     

...

     

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

所以是的,一个类可以同时拥有它所引用的对象的组合和聚合关系,但可能不是你所显示的例子。

答案 1 :(得分:0)

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