Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有必要不修改成分?_Java_Oop_Uml - Fatal编程技术网

Java 是否有必要不修改成分?

Java 是否有必要不修改成分?,java,oop,uml,Java,Oop,Uml,我在寻找用Java实现聚合和组合的方法时遇到了这个答案。下面是回答者对合成的实现- final class Car { private final Engine engine; Car(EngineSpecs specs) { engine = new Engine(specs); } void move() { engine.work(); } } 我想问的是,是否必须将引擎声明为privatefinal才能使其成为有效的组合?合成是否也意味着发动机

我在寻找用Java实现聚合和组合的方法时遇到了这个答案。下面是回答者对合成的实现-

final class Car {

  private final Engine engine;

  Car(EngineSpecs specs) {
    engine = new Engine(specs);
  }

  void move() {
    engine.work();
  }
}

我想问的是,是否必须将引擎声明为privatefinal才能使其成为有效的组合?合成是否也意味着发动机的属性在其使用寿命内永远不会改变?

虽然不变性是一个好的设计目标,但不要求合成被视为“有效”。

虽然不变性是一个好的设计目标,但不要求合成被视为“有效”。

否。例如,a可以允许在运行时交换策略,并且该策略由另一个(上下文)类组成

不变性是一个很好的模式,但有些场景允许和/或要求您更改组合。例如,当汽车发生故障时,您将如何更换发动机(如上?

否)。例如,a可能允许在运行时更换策略,并且该策略由另一个(上下文)类组成

不变性是一个很好的模式,但有些场景允许和/或要求您更改组合。例如,当汽车发生爆炸时,您如何更换发动机(上图?

简短回答:

长答案:

UML组合只是意味着组合实例的生命周期与其上级实例紧密耦合。因此,没有不允许交换或修改复合实例的约束


但是kep要记住聚合和合成之间的区别

聚合:

  • 主管->学生(如果主管辞职,学生可能会完成学业)
  • 公司->员工
组成:

  • 建筑->房间(如果建筑被毁,房间也会被毁)
  • 公司->部门
简短回答:

长答案:

UML组合只是意味着组合实例的生命周期与其上级实例紧密耦合。因此,没有不允许交换或修改复合实例的约束


但是kep要记住聚合和合成之间的区别

聚合:

  • 主管->学生(如果主管辞职,学生可能会完成学业)
  • 公司->员工
组成:

  • 建筑->房间(如果建筑被毁,房间也会被毁)
  • 公司->部门

那么,这难道不意味着,如果我在
Car
中简单地声明一个
Engine
类型的对象,它将成为一个组合,并且以任何方式不表示聚合吗?@nisargshah95否!cComposition需要特定的实现行为。类成员的简单声明遵循聚合原则,这意味着如果类“car”的生命周期结束,引擎可以在其他地方生存。合成意味着“引擎”实例的生命周期以“汽车”的生命周期结束。因此,组合要求,作为程序员,您必须让舒尔在“汽车”生命周期结束时将“引擎”实例的所有引用设置为“空”。然后,所有实例都可以被垃圾收集,然后销毁。但是如果
引擎
汽车
的私人成员,那么
汽车
销毁后,它不会立即变得无用吗?或者是Java以相同的方式实现了这两个概念,但本质上它们是不同的?Java本身并不知道对象引用的聚合与组合。它只是传递引用。您可能会争辩说,持有原语的对象用UML术语表示组合,因为它不是作为引用持有关联、聚合和组合的良好定义。这与这里所说的略有不同。关联意味着有一个引用,聚合意味着没有引用周期,正如你已经说过的,组成是关于对象的所有权/生命周期。所以,这难道不是意味着如果我只是在
汽车中声明
引擎
类型的对象,它将成为一个组合,无论如何都不代表聚合?@nisargshah95不!cComposition需要特定的实现行为。类成员的简单声明遵循聚合原则,这意味着如果类“car”的生命周期结束,引擎可以在其他地方生存。合成意味着“引擎”实例的生命周期以“汽车”的生命周期结束。因此,组合要求,作为程序员,您必须让舒尔在“汽车”生命周期结束时将“引擎”实例的所有引用设置为“空”。然后,所有实例都可以被垃圾收集,然后销毁。但是如果
引擎
汽车
的私人成员,那么
汽车
销毁后,它不会立即变得无用吗?或者是Java以相同的方式实现了这两个概念,但本质上它们是不同的?Java本身并不知道对象引用的聚合与组合。它只是传递引用。您可能会争辩说,持有原语的对象用UML术语表示组合,因为它不是作为引用持有关联、聚合和组合的良好定义。这与这里所说的略有不同。关联意味着存在一个引用,聚合意味着不存在引用周期,正如您已经说过的,组合是关于对象的所有权/生命周期的。可以更改
引擎
实例的属性