我希望了解如何在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中两者如何工作?(我知道什么是组合和聚合)}
A
的字段实际上是对A
对象的引用。这也意味着该字段将始终以空指针开始,您必须显式地将其分配给new A()
或其他内容。class B {
A a;
B(A a) {
this.a = a;
}
B() {
this(new A());
}
}
我认为这是用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;
}
//...
}
a
。通常情况下,如果意图是组合,你会使a
成为final
,这样它就永远不会改变,并确保在构造函数中对其赋值一个非空值。如果意图是聚合,你可能会提供一个setA()
方法来更改a
。 - Russell Zahnisera
的final
并不会将聚合缩小为组合。当B
的封闭实例死亡时,对象仍然不会死亡。 - Andreas DolkA
的,只有当A
仅作为B
的一部分存在时才算组合。但如果A
是B
永久且必要的一部分,即使A
也可以独立存在或作为另一个类的一部分,我认为它也应该算作组合。我不确定哪个定义是正确的。 - Russell Zahniser