Java软件工程:组合与聚合

Java软件工程:组合与聚合,java,oop,software-design,Java,Oop,Software Design,我真的很难理解合成和聚合。在下面的代码中,我想知道下面哪个car实例使用组合逻辑或聚合逻辑 public class Engine { public Engine() { } } public class Car1 { public final Engine engine; public Car1() { engine = new Engine(); } } class Car2{ public Engine en

我真的很难理解合成和聚合。在下面的代码中,我想知道下面哪个car实例使用组合逻辑或聚合逻辑

public class Engine {

    public Engine() {

    }
}

public class Car1 {

    public final Engine engine;

    public Car1() {
        engine = new Engine();

    }

}

class Car2{

    public Engine engine;

    public Car2(Engine engine) {
        this.engine = engine;
    }
}

class Car3{

    public final Engine engine;

    public Car3(Engine engine) {
        this.engine = engine;
    }
}

class Car4{

       Engine engine;

       public Car4(){

        this.engine = new Engine();

       }

}


class Main{

    public static void main(String[] args) {

        Engine engine = new Engine(); 
        Car1 car1 = new Car1(); 

        Car2 car2_1 = new Car2(new Engine());
        Car2 car2_2 = new Car2(engine);

        Car3 car3_1 = new Car3(new Engine());
        Car3 car3_2 = new Car3(engine);

        Car4 car4_1 = new Car4();

    }
}


根据我的说法,car1、car2、car3遵循组合逻辑。但我读过很多地方说car3_2也是作文。为什么?如果我们销毁car3_2,引擎实例仍然存在,因此应该是聚合。

是的,引擎仍然存在于car3_2实例之外,因此应该是聚合。

我猜在Java中,很难看到区别,因为对于任何对象,您只能存储对某个堆位置的引用,而在C++等其他编程语言中,你可以选择一个对象是否保存对另一个对象的引用,而一个对象保存该对象的嵌入副本。 但是我们在java中,并且在看生命周期。。。。 引擎是否会比汽车存在的时间更长取决于是否有人持有对该引擎的引用。除了car4之外,所有的汽车都有一个公开的引擎字段,任何人都可以在扔掉汽车的同时获取并保留参考,从而保留引擎

我更希望car4没有软件包(默认),甚至没有私人访问。这意味着没有人可以访问引擎引用(除非该引用被泄露到其他地方),您可以谈论组成

编辑:重读你的问题和代码样本到底部,我认为问题是关于它们是如何构造的。Car1和car4_1都有自己隐式创建的引擎,当无人获取引用时,汽车和引擎会同时被垃圾收集。我把这叫做作文

Car2_1和car3_1的行为是相同的,尽管引擎是显式构造的。他们会用各自的引擎收集垃圾。这种行为类似,但也允许使用下一种模式。我猜它是作为诱饵引入的

Car2_2和car3_2都共享一个显式创建的引擎,对它的引用出现在main方法中。其中一辆或两辆车可能会被垃圾收集,但引擎将保持,除非所有三个参考都被放弃。因此,这可能会显示聚合

  • 聚合意味着子级可以独立于父级而存在的关系。示例:班级(家长)和学生(孩子)。删除该类,学生仍然存在
  • 组合意味着子对象不能独立于父对象而存在的关系。示例:房子(家长)和房间(孩子)。房间不是与房子分开存在的
因此,就其本质而言,任何物体的合成都不可能是:

  • 可以由多个其他对象拥有
  • 可以无主(初始化完成后)
  • 可以更改所有者
car3_2
无法合成,因为它与
car2_2
共享发动机

其他的都是作文吗?从逻辑上讲,在现实生活中,您可以将发动机从一辆汽车上拆下并安装到另一辆汽车上,因此汽车与发动机的关系是聚合的

通过编程方式,
final
关键字可以防止从
汽车
中删除
发动机
,但不能防止将同一发动机添加到另一辆汽车中,也不能防止汽车被“删除”和发动机更换车主,因此,
final
本身并不能确保组合关系

当构造函数将引擎作为参数时,
Car
类无法确保引擎未共享,因此无法确保组合关系

只有当
引擎
汽车
构造器创建且字段为
最终
(或者实际上是最终的,本质上是
私有
,没有setter方法)时,才能保证遵守合成定义

这并不意味着其他以
引擎
为参数的组件不能有效地组合。这取决于它是如何使用的。例如,如果
汽车
是由
工厂
类创建的,工厂可以强制执行组合规则。

可能重复的