Java 是否有必要不修改成分?
我在寻找用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才能使其成为有效的组合?合成是否也意味着发动机
final class Car {
private final Engine engine;
Car(EngineSpecs specs) {
engine = new Engine(specs);
}
void move() {
engine.work();
}
}
我想问的是,是否必须将引擎声明为privatefinal才能使其成为有效的组合?合成是否也意味着发动机的属性在其使用寿命内永远不会改变?虽然不变性是一个好的设计目标,但不要求合成被视为“有效”。虽然不变性是一个好的设计目标,但不要求合成被视为“有效”。否。例如,a可以允许在运行时交换策略,并且该策略由另一个(上下文)类组成 不变性是一个很好的模式,但有些场景允许和/或要求您更改组合。例如,当汽车发生故障时,您将如何更换发动机(如上?否)。例如,a可能允许在运行时更换策略,并且该策略由另一个(上下文)类组成 不变性是一个很好的模式,但有些场景允许和/或要求您更改组合。例如,当汽车发生爆炸时,您如何更换发动机(上图?简短回答: 不 长答案: UML组合只是意味着组合实例的生命周期与其上级实例紧密耦合。因此,没有不允许交换或修改复合实例的约束
但是kep要记住聚合和合成之间的区别 聚合:
- 主管->学生(如果主管辞职,学生可能会完成学业)
- 公司->员工
- 建筑->房间(如果建筑被毁,房间也会被毁)
- 公司->部门
但是kep要记住聚合和合成之间的区别 聚合:
- 主管->学生(如果主管辞职,学生可能会完成学业)
- 公司->员工
- 建筑->房间(如果建筑被毁,房间也会被毁)
- 公司->部门
Car
中简单地声明一个Engine
类型的对象,它将成为一个组合,并且以任何方式不表示聚合吗?@nisargshah95否!cComposition需要特定的实现行为。类成员的简单声明遵循聚合原则,这意味着如果类“car”的生命周期结束,引擎可以在其他地方生存。合成意味着“引擎”实例的生命周期以“汽车”的生命周期结束。因此,组合要求,作为程序员,您必须让舒尔在“汽车”生命周期结束时将“引擎”实例的所有引用设置为“空”。然后,所有实例都可以被垃圾收集,然后销毁。但是如果引擎
是汽车
的私人成员,那么汽车
销毁后,它不会立即变得无用吗?或者是Java以相同的方式实现了这两个概念,但本质上它们是不同的?Java本身并不知道对象引用的聚合与组合。它只是传递引用。您可能会争辩说,持有原语的对象用UML术语表示组合,因为它不是作为引用持有关联、聚合和组合的良好定义。这与这里所说的略有不同。关联意味着有一个引用,聚合意味着没有引用周期,正如你已经说过的,组成是关于对象的所有权/生命周期。所以,这难道不是意味着如果我只是在汽车中声明引擎
类型的对象,它将成为一个组合,无论如何都不代表聚合?@nisargshah95不!cComposition需要特定的实现行为。类成员的简单声明遵循聚合原则,这意味着如果类“car”的生命周期结束,引擎可以在其他地方生存。合成意味着“引擎”实例的生命周期以“汽车”的生命周期结束。因此,组合要求,作为程序员,您必须让舒尔在“汽车”生命周期结束时将“引擎”实例的所有引用设置为“空”。然后,所有实例都可以被垃圾收集,然后销毁。但是如果引擎
是汽车
的私人成员,那么汽车
销毁后,它不会立即变得无用吗?或者是Java以相同的方式实现了这两个概念,但本质上它们是不同的?Java本身并不知道对象引用的聚合与组合。它只是传递引用。您可能会争辩说,持有原语的对象用UML术语表示组合,因为它不是作为引用持有关联、聚合和组合的良好定义。这与这里所说的略有不同。关联意味着存在一个引用,聚合意味着不存在引用周期,正如您已经说过的,组合是关于对象的所有权/生命周期的。可以更改引擎
实例的属性