class Book {
private Chapter[] chapters = new Chapter[5];
}
class Chapter {
private Book book;
}
这是实现上述关系的正确方法吗? 我需要对此进行解释。感谢。
答案 0 :(得分:1)
这还不够。
在撰写关系中,如果whole
实例被销毁,part
实例也应立即销毁。
你应该有一些代码(一些机制)来做到这一点。
例如,如果从类的外部推送Chapter
的实例(例如使用构造函数),则在删除Book
实例时应该小心删除这些实例。 / p>
如果您的实例是在Book
类中创建的(通过new ...),则无需执行任何操作,您的Chapter
实例将被Book
实例删除。
在此参考文献中:Object Prime,Third Edition(作者Scott W. Ambler,2004)
在( 13.4.12.7实施组合)
您可能已经猜到了,聚合和组合关联 处理方式与关联完全相同。主要区别, 从编程的角度来看,聚合意味着更紧密 两个类之间的关系比关联做的要好 构成意味着更紧密的关系。虽然图。 13.11不包括作文联想,研讨会和课程之间的关联很紧,事实上,至少和你一样紧 会看到组成(不幸的是,句子规则没有 在这种情况下有意义)。在图13.31中,您可以看到结果 在课程中执行remove()方法时的closeness 课程 - 当课程被删除时,其研讨会也将被删除。 :此强> 生命周期管理代码类型在组合中是典型的 的层次结构强>
/** * Remove a course * * @postcondition The course and its seminars will be removed */ public void remove() { if (getSeminars() != null) { // Clone the original set because we can't safely remove // the items from the set while we iterate over it HashSet set = (HashSet) getSeminars().clone(); Iterator iterator = set.iterator(); // Remove each seminar of this course while (iterator.hasNext()) { Seminar seminar = (Seminar) iterator.next(); // Remove the seminar from the collection getSeminars().remove(seminar); } } // Remove the instance from permanent storage // Persistence code ... }
考虑这个例子:
class Person {
private final Brain brain;
Person(Brain humanBrain) {
brain = humanBrain;
}
}
在代码的其他部分,我们可以这样定义:
Brain b = new Brain();
// or we have an instance of Brain in other scopes
// not exactly in this scope
Person p1 = new Person(b);
Person p2 = new Person(b);
因此,在此代码中,我们可以将Brain
的一个实例设置为两个不同的Persons
。
注意:在撰写时,我们应该管理实例的生命周期。只定义任何类的private final
,不要在它们之间显示组合。
例如,以下示例可以是合成。因为Part
被删除后whole
的实例被删除了:
public class House {
private final Room room;
public House() {
room = new Room();
}
}
在作文中:
whole
可能直接负责part
的创建或销毁。或者它可以使用已经从类外部(通过代码的其他部分)创建和管理的“部分”。在这种情况下,删除part
应由外部代码管理,part
应在whole
删除后立即删除。
我们应该建立一种机制,在删除part
时删除whole
。 如果我们不删除part
并在其他wholes
中使用它,那么它就是聚合或关联。