聚合,关联和组合

Buk*_*cen 4 java

我有一个简单的例子:

public class Order 
{

 private ArrayList<Product> orders = new ArrayList<Product>();

 public void add(Product p)
 {
  orders.add(p);
 }
}
Run Code Online (Sandbox Code Playgroud)

它是聚合还是组合?我想这是构图,因为删除订单后订单会减少,对吗?不幸的是,这是一项任务,答案是不同的; /你知道为什么吗?

第二个问题:

public class Client extends Person 
{
    String adress = "";

    Orders orders = new Orders();

    public Client(String n, String sn)
    {
     name = n;
     surName = sn;
    }

    public String getAddress()
    {
     return adress;
    }
    public Orders getOrders()
    {
     return this.orders; 
    }
}
Run Code Online (Sandbox Code Playgroud)

它是客户和订单之间的关联吗?我的老师告诉我这是关联,但我想知道为什么它不是聚合/组合 - 他告诉我只有当一个类包含很少的不同类的实例时才会发生聚合或组合 - 是吗?我猜不是,因为例如汽车包含一个轮子和它的聚合我猜?

这是什么类型的关系,为什么?

Bil*_*ard 6

你的第一个例子是聚合.orders删除Order实例时,可能会删除该变量,但每个Product仍然具有含义,并且可以存在于Order类之外.

你的第二个例子就是对的.因为客户端包含对Orders的(has-a)引用,所以这是组合(因为orders没有a时不存在Client).

更新以解决您的评论:

聚合和组合都是不同类型的关联,但它们是特定类型的关联.为了使两个类只具有没有聚合或组合的关联,它们需要比给定示例更弱的链接.这是一个(人为的)例子:

class A {
    String phrase = "These pretzels are making me thirsty.";

    public String process(B b) {
        // use a B object to do something
        String tmp = b.doSomething(phrase);

        // do more processing...
        return tmp;
    }
}

class B {
    public String doSomething(String s) {
        // do something with the input string and return
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这里不存在组合物或聚集(A不具有它自己的参照B对象),但由于B的一个实例是使用由所述的一个方法,存在的关联.


lal*_*lit 1

真正来说,Java 中没有组合,一切都是聚合。该组合可以存在于像 C++ 这样的语言中,其中对象可以在堆栈上声明并与父对象一起生存和消亡。在 Java 中,一切都位于堆上。

对于第二个问题,Order 与 Product 具有聚合关系。当我们将顺序作为参数传递给产品中的方法时,可以建立关联关系。产品使用传递的引用来完成工作,但不会在某些子引用中缓存该引用。