Java 关于合成与聚合的混淆(重新制定并更正)

Java 关于合成与聚合的混淆(重新制定并更正),java,php,oop,Java,Php,Oop,这是一个我之前问过的问题,但它的措辞不是很好,并且包含了一些错误(包括我提到的答案,很抱歉),所以我再试一次,希望这个问题更有意义 我对以下线程中的一个答案感到困惑,我指的是第三个答案中的代码片段(目前为ca 117 Upvots): 答案说明了使用依赖项注入的组合(请参见此处的代码片段) 编辑:重复如下: class Person { String Title; String Name; Int Age; public Person(String title, St

这是一个我之前问过的问题,但它的措辞不是很好,并且包含了一些错误(包括我提到的答案,很抱歉),所以我再试一次,希望这个问题更有意义

我对以下线程中的一个答案感到困惑,我指的是第三个答案中的代码片段(目前为ca 117 Upvots):

答案说明了使用依赖项注入的组合(请参见此处的代码片段)

编辑:重复如下:

class Person {
   String Title;
   String Name;
   Int Age;

   public Person(String title, String name, String age) {
      this.Title = title;
      this.Name = name;
      this.Age = age;
   }

}

class Employee {
   Int Salary;
   private Person person;

   public Employee(Person p, Int salary) {
       this.person = p;
       this.Salary = salary;
   }
}

Person johnny = new Person ("Mr.", "John", 25);
Employee john = new Employee (johnny, 50000);
让我困惑的是,在学校,我们学到了:
-直接关联(与此问题无关)
-聚合:弱关系->有关系
-组合:强大的关系->所有权,其中一方离不开另一方

学校给出的例子暗示DI是聚合的一部分,因为它表明弱关系。
与composition相反,示例表明ClassB是在classA的构造函数中实例化的,或者是由classA的setter实例化的。ClassA在此明确负责创建classB(否则classB将不存在)。
给出的示例是一个Person类,其中Heart类在Person类的构造函数中实例化


依赖注入意味着聚合这一假设正确吗?或者,依赖注入还可能包含具有组合的DI吗

理解组合关系的关键在于,除了容器对象之外,所包含的对象是已知的,并且没有任何东西使用它。在人类包含hart的示例中,与人类的交互从不涉及直接操纵hart。因此,这是一种遏制关系。如果心脏暴露给其他人操纵,那么它将是一种聚合关系

现在,仅仅因为构建Employee的对象必须构建包含的Person,并不能阻止关系成为包含关系之一。示例中的关键是person字段是私有的,并且在employee对象之外无法操纵其person。这就是为什么它是包容而不是聚合

我同意你可以设置一个令人讨厌的例子,其中构建
john
的对象抓住
johny
并继续操纵它。实际上,此对象将在不调用其任何方法的情况下更改
john
的状态。这是非常糟糕的做法,不要这样做

--延续--

并且抛弃了“宁可包容也不要继承”的想法。我建议您也更喜欢包含而不是聚合。包含关系意味着应用程序的很大一部分可以忽略包含的类甚至存在于系统中这一事实。这是因为它们的所有交互都是与容器的交互,而不是与所包含的对象的交互


当然,有时不可能包含,聚合在逻辑上是表达相关关系所必需的。

可能会有所帮助:@christopher Event您共享的线程的顶部答案表明依赖关系是一种关联形式,这是一种弱关系。因此,我假设您不能使用组合DI?DI意味着子对象在传递到的对象之前就存在,因此从逻辑上讲,它似乎不合理。在提供的示例中,对象
Person
完全独立于对象
Employee
,而存在,无论是在代码上还是在概念上。一个人不能有工作,因此他们不是雇员。现在,一个人
是否有一名
员工
或者一个
是否是一名
员工
是一个不同的讨论。@christopher我同意这似乎不是最好的例子。除非熊能成为雇员,否则我想继承遗产会是一个更好的选择。。。