0

组合是整体/部分的关系。编码组合关系的常用方法是在组合(整体)对象的构造函数中创建部​​分对象。java中的示例:

public class Car {

private String brand;
private ArrayList<Tire> theFourTires = new ArrayList<Tire>();

public Car(String brand)
{
    this.brand = brand;
    for (int i = 1; i < 5;i ++)
    {
        // here the "composition" relationship
        theFourTires.add(new Tire());
    }
}

当我们想决定哪些对象将成为部件时,我们可以使用add ...方法将部件对象添加到组合中。您必须遵守这条规则(UML 规范):部分对象不能被共享(被另一个对象引用,除了复合对象)。所以,我认为最好,当你调用 add 方法时,不要在调用 add 方法的方法中引用 part 对象,就像这样,在 Car 类中:

public void addPart(CarParts aPart)
{
    this.parts.add(aPart);
}

从另一个对象调用 add 方法:

Car c = new Car("Ford Torino");
c.addPart(new Tire());

代替

Tire t = new Tire();
c.addPart(t);

因为在这种情况下,实例是通过t引用共享的,即使是很短的时间,组合关系也变成了聚合。在这种情况下,您可以在 t 对象上调用方法并违反部分对象的封装。零件对象必须仅由组合管理。你怎么看待这件事 ?感谢世界!

4

3 回答 3

1

我认为这根本不重要,因为只要您有一个获取器来访问您的 4 个轮胎,您就可以获得对不再Tire由其管理的对象的引用Car

delete由于Java中没有运算符,因此Car对象不可能删除Tire它所链接的 4 个对象,因此不需要组合类型的关系,也不可能在代码方面实现它。

于 2018-06-12T09:06:20.657 回答
0

在 addPart() 方法中创建防御性副本不是最好的吗?像这样的东西:

public void addPart(CarParts aPart)
{
    this.parts.add(new CarParts(aPart);
}

我假设您希望每个人都无法访问这些内容。

于 2018-06-12T11:24:46.617 回答
0

给定的关联可能是也可能不是可导航的,并且可能是也可能不是组合。如果它是可导航的,那么其他东西可以导航它并从源(汽车)到达关联的目标(轮胎)。可导航性不影响关联是否为组合。封装强制导航,而不是组合。

于 2018-06-12T09:56:44.930 回答