如何在Java中编写组合和聚合

5

我希望了解如何在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中两者如何工作?(我知道什么是组合和聚合)}

3个回答

8
Java本身并不区分组合和聚合。在Java类型系统中,你无法表达引用的所有权——如果你需要明确表达所有权,你必须通过其他方式来表示(通常是通过构造一个新对象并将其存储在类的实例中)。由于Java具有GC,内存所有权根本不需要表达;内存完全由GC拥有和管理。当然,对于其他资源,情况并非如此,你可能仍然想要表达所有权。

1
在Java中,对象仅由指针引用。这意味着类型为A的字段实际上是对A对象的引用。这也意味着该字段将始终以空指针开始,您必须显式地将其分配给new A()或其他内容。
class B {
   A a;

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

   B() {
      this(new A());
   }
}

谢谢。这是聚合吗? - KKK
这取决于你如何使用 a。通常情况下,如果意图是组合,你会使 a 成为 final,这样它就永远不会改变,并确保在构造函数中对其赋值一个非空值。如果意图是聚合,你可能会提供一个 setA() 方法来更改 a - Russell Zahniser
再次感谢。现在很清楚了。这个链接也是一个例子。我想知道它是否正确。链接 - KKK
将引用指针指向字段afinal并不会将聚合缩小为组合。当B的封闭实例死亡时,对象仍然不会死亡。 - Andreas Dolk
嗯,这个定义是基于A的,只有当A仅作为B的一部分存在时才算组合。但如果AB永久且必要的一部分,即使A也可以独立存在或作为另一个类的一部分,我认为它也应该算作组合。我不确定哪个定义是正确的。 - Russell Zahniser

-1

我认为这是用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;  
    }  

    //...  
}  

来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接