Java 组合和聚合同时进行 class?

Java Composition and Aggregation at same class?

假设我们有两个 class 命名为点和线。 Line class 有两个构造函数。这是点 class.

的代码
// 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;
   }
}    

这是第 class 行的代码。

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;
   }
}

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

对于聚合和组合之间的区别,普遍接受的定义是终生责任和所有权。

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

值得quoting Fowler on this:

Few things in the UML cause more consternation than aggregation and composition

...

Aggregation (white diamond) has no semantics beyond that of a regular association. It is, as Jim Rumbaugh puts it, a modeling placebo

...

Composition (black diamond) does carry semantics. The most particular is that an object can only be the part of one composition relationship

所以是的,class 可以与它​​所引用的对象同时具有组合和聚合关系,但可能不像您显示的示例那样。

由于组合的定义特征(相对于聚合)具有 exclusive/non-shareable 个部分(参见 ),您的 Point-Line 部分-整体示例关系显然是一种聚合(无论您是将点对象传递给构造函数还是在构造函数中创建它们),因为定义一条线的两个点可以与其他线共享。