【问题标题】:How to write Composition and Aggregation in java如何在java中编写组合和聚合
【发布时间】:2012-04-09 09:01:06
【问题描述】:

我想知道如何在java中识别组合和聚合代码。我有 C++ 代码,但我不明白如何用 java 编写。

作曲

class A {};
class B { A composited_A; };

通过指针聚合

class A {};
class B
{
A* pointer_to_A;
B(A anA){ 
pointer_to_A = &anA;
}

谁能告诉我两者在 JAVA 中的工作方式。 (我知道合成和聚合是什么意思) };

【问题讨论】:

    标签: java c++ oop


    【解决方案1】:

    Java 本身根本不区分组合和聚合。您无法在 Java 类型系统中表达引用所有权的概念——如果您明确需要表达所有权,则必须使用其他方式来表示这一点(通常简单地通过构造一个新对象来存储在类的实例中)。

    由于 Java 有 GC,内存的所有权根本不需要表达;内存完全由 GC 拥有和管理。当然,其他资源的情况并非如此,在这里您可能仍想表达所有权。

    【讨论】:

      【解决方案2】:

      在 Java 中,对象只能由指针引用。这意味着A 类型的字段实际上是对A 对象的引用。这也意味着该字段将始终以空指针开头,并且您必须将其显式分配给new A() 或其他任何内容。

      编辑:

      class B {
         A a;
      
         B(A a) {
            this.a = a;
         }
      
         B() {
            this(new A());
         }
      }
      

      【讨论】:

      • 谢谢。这是聚合吗?。
      • 这取决于你如何使用a。通常,如果意图是组合,则将 a 设置为 final 以使其永远不会更改,然后确保在构造函数中为其分配非空值。如果意图是聚合,您可以提供一个setA() 方法来更改a
      • 再次感谢。现在很清楚了。这个链接也是例子。我想知道哪里是对的。link[link]
      • 使引用指针指向字段a final 不会将聚合缩小到组合。当B 的封闭实例死亡时,对象仍然不会死亡。
      • 嗯。这用A 定义它,只有当A 仅作为B 的一部分存在时,它才是组合。如果AB 的永久和必要部分,我认为它是组合,即使A 也可以单独存在或作为另一个类的一部分存在。我不确定哪个是正确的。
      【解决方案3】:

      我认为这是用 Java 代码表达组合和聚合的最佳方式。

      作曲

      public class Person  
      {  
          private final Name name;  
      
          public Person (String fName, String lName)  
          {  
              name = new Name(fName, lName);  
          }  
      
          //...  
      }  
      

      聚合

      public class Person  
      {  
          private Costume currentClothes;  
      
          public void setClothes(Costume clothes)  
          {  
              currentClothes = clothes;  
          }  
      
          //...  
      }  
      

      Source

      【讨论】:

        猜你喜欢
        • 2017-07-10
        • 2019-08-19
        • 2023-03-21
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 2016-05-22
        • 2018-08-29
        • 2015-03-10
        相关资源
        最近更新 更多