当前位置: 首页 > 知识库问答 >
问题:

用Java实现组合

戚英逸
2023-03-14
class Book {
    private Chapter[] chapters = new Chapter[5];
 }

class Chapter {
    private Book book;
}

这是实现上述关系的正确方法吗?我需要解释一下。谢谢。

共有1个答案

漆雕和昶
2023-03-14

这还不够。

在组合关系中,如果整个实例被销毁,则部分的实例也应立即销毁。

你应该有一些代码(一些机制)来实现这一点。

例如,如果从类外部推送<code>Chapter</code>s的实例(例如通过使用构造函数),则在删除<code>Book</code}实例时,应小心删除这些实例。

如果您的实例是在Book类中创建的(通过new…),则无需执行任何操作,您的Chapter实例将被Book删除。

在此参考中:Object Prime,第三版(Scott W. Ambler,2004)
在(13.4.12.7 实现组合)一节中

您可能已经猜到,聚合和组合关联的处理方式与关联完全相同。从编程的角度来看,主要的区别在于,聚合意味着两个类之间的关系比关联更紧密,而组合意味着更紧密的关系。虽然图13.11没有包括作文的关联,但研习班和课程之间的关联是紧密的,事实上,至少和你在作文中看到的一样紧密(不幸的是,句子规则在这种情况下没有意义)。在图13.31中,您可以看到在课程类中实现remove()方法时这种紧密性的结果——当一门课程被删除时,它的研讨会也被删除。这种类型的生命周期管理代码在组合层次结构中很典型。

/**
 * 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的一个实例设置为两个不同的Person

注意:在组合中,我们应该管理实例的生命周期。只定义任何类的私人决赛,不显示它们之间的组合。

例如,下面的示例可以是组合。因为Part的实例在整个被删除时被删除:

public class House {    
   private final Room room;

   public House() {    
       room = new Room();
   }
}

在组合中:
整个可能直接负责部分的创建或销毁。或者它可能使用已经从类外部创建和管理的“部分”(由代码的其他部分)。在这种情况下,部分的删除应该由外部代码管理,部分应该在整个删除后立即删除。

我们应该建立一种机制,在删除整体时删除part。如果我们不删除部分并在其他整体中使用它,那么它就是聚合或关联。

 类似资料:
  • 问题内容: 这很奇怪。一位同事询问了java中myArray.hashCode()的实现。我以为我知道,但是后来我进行了一些测试。检查下面的代码。我注意到的奇怪想法是,当我编写第一个系统时,结果是不同的。请注意,这几乎就像报告内存地址并修改类一样,将地址或其他内容移动了。只是想我会分享。 问题答案: 该方法继承自,这意味着哈希码取决于引用。要基于数组的内容获取哈希码,请使用。 请注意,尽管它是一个

  • 本文向大家介绍堆排序实例(Java数组实现),包括了堆排序实例(Java数组实现)的使用技巧和注意事项,需要的朋友参考一下 堆排序:利用大根堆 数组全部入堆,再出堆从后向前插入回数组中,数组就从小到大有序了。 堆排序:对数组进行构造堆(最大堆) 以上这篇堆排序实例(Java数组实现)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我尝试用Java的编程思想实现OAuth,但失败了。我不知道为什么,但是我的代码不起作用。每次运行程序时,都会引发IOException,其原因为“ java.io.IOException:服务器返回的HTTP响应代码:401”(401表示未授权)。我仔细查看了文档,但是我真的不明白为什么它不起作用。我想使用的OAuth提供程序是twitter,我也在其中注册了我的应用程序。 在此先感

  • 问题内容: 因此,我正在开发一个简单的Java应用程序,该应用程序允许用户输入图像作为查询,并使该应用程序将其与图像数据库进行比较(基本上只不过是不同图像的目录)。我基本上是在研究几种图像相似性测量技术,以找出哪些适合比较汽车图片。 我一直在做一些阅读,除了FFT / SSIM之外,我还阅读了SIFT算法可以产生非常好的结果。但是,作为只有大约一年的Java基本经验的人,老实说,我不确定我是否有足

  • 本文向大家介绍Java Web中常用的分页组件(Java端实现),包括了Java Web中常用的分页组件(Java端实现)的使用技巧和注意事项,需要的朋友参考一下  前言 好久没写Web程序了,这一段时间看了看原来师弟们做的一些程序,感觉还是有很多不足,一个比较典型的例子就是分页查询的实现,正好借着这个机会简单记录一下。 分析 使用场景 “分页”在Web程序里非常常见,比如我们在页面上经常要展示一

  • 问题内容: 数组在Java中被实现为对象,对吗?如果是这样,我可以在哪里查看数组类的源代码。我想知道数组中的length变量是否定义为常量,如果是这样,为什么不是全部使用大写字母LENGTH来使代码更易于理解。 问题答案: 尽管从它们继承java.lang.Object的角度来看,数组是Object,但是这些类是作为语言的特殊功能动态创建的。它们未在源代码中定义。 考虑以下数组: 没有这样的源代码