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

以编程方式区分合成和聚合

别旻
2023-03-14

我正在通过下面的链接来找出组合和聚合之间的区别。

https://www . geeks forgeeks . org/association-composition-aggregation-Java/

我能够理解,组合意味着一种关系,其中子项不能独立于父项而存在,而聚合意味着子项可以独立于父项存在的关系。但是无法理解我如何以编程方式区分它.下面是链接中给出的聚合和组合示例。在这两种情况下,类在结构上是相同的,除了学生和部门类有一个额外的变量“名称”。就像在组合中一样“子子不能独立于父级存在”,但在这里我可以创建一个单独的 Book 对象并使用它而不将其添加到库中。

聚合

// student class
class Student 
{
    String name;
    int id ;
    String dept;

    Student(String name, int id, String dept) 
    { 
        this.name = name;
        this.id = id;
        this.dept = dept;
    }
}



/* Department class contains list of student
Objects. It is associated with student
class through its Object(s). */
class Department 
{
    String name;
    private List<Student> students;

    Department(String name, List<Student> students) 
    {
        this.name = name;
        this.students = students;    
    }

    public List<Student> getStudents() 
    {
        return students;
    }
}

作文

class Book 
{
    public String title;
    public String author;

    Book(String title, String author)
    {
        this.title = title;
        this.author = author;
    }
}

// Libary class contains 
// list of books.
class Library 
{
    // reference to refer to list of books.
    private final List<Book> books;

    Library (List<Book> books)
    {
        this.books = books; 
    }

    public List<Book> getTotalBooksInLibrary()
    {
       return books;  
    }

}

共有2个答案

钮安歌
2023-03-14

在现实世界中,一本书确实可以独立存在,而不必归图书馆所有。但是,如果你有一个LibraryBook类,其中包含dateAcquirecurrentBorrower等字段呢?使用您的设计,您仍然可以创建没有库的 LibraryBook 实例

这就是像C这样的语言可以更明确地组合的地方:在C中,一个对象可以按值保存它的部分。在Java,每个对象都由一个指针处理(好吧,Java人们不叫它们指针;他们称之为引用。)这使得区分组合和聚合变得更加困难。在Java,你可以通过仔细的设计来做到这一点。

例如,我们可以通过< code>Library的方法使< code>LibraryBook类只可实例化:

class Library {
    class LibraryBook {
        private LibraryBook() {/*private constructor prevents independent instantiation*/}
    }
    LibraryBook createBook(String title, etc...);
}

此外,如果我们使Library Book的变形器方法只能被库类访问,我们可以确保该书仍然是其拥有的库的一部分。

蒋骏
2023-03-14

据我所知(也许其他人可以给出更好的答案),你不能仅仅通过查看Java代码来评估这种关系是聚合还是组合。反之亦然。

首先创建世界的概念模型。图书馆有书,汽车有轮子。然后你会想,在我工作的环境中,一本书没有图书馆,或者一个轮子没有汽车,有意义吗。因此,例如,如果你正在编写一个赛车游戏,你将无法使用车外的轮子。但如果你正在编写一些汽车维修应用程序,你将独立于某些特定的汽车来处理车轮。

因此,首先您要决定是否需要聚合或组合,然后在代码中实现它。实现可以是对象< code>Car具有< code>List

如果是作文,它的用法可能会有一些限制:

    < li >除了< code>Car之外,任何对象都不会保存对< code>Wheel的引用。 < li> Wheel甚至可能是私有类或包私有类。 < li >如果< code>Car保存在数据库中,当您删除它时,也会自动删除它的所有< code > Wheel 。

但是如果你决定它的组成,就要由你来执行这些限制。

 类似资料:
  • 我一直在使用Spring boot,并且在我的项目中删除了所有文件。不幸的是,它还使用了Spring集成,根据我的经验,Spring集成非常基于。 我有一个场景,要求我有一个聚合器,并让聚合器每隔秒轮询一次。 这可以像这样使用XML来完成(从以前的SO问题中获得的示例): 我已经找到了一个类,这个类有点像是在玩把戏,它的bean定义是: 但是,只有在与此处理程序关联的中接收到新消息时,才触发的方法

  • 我使用聚合物起动器套件1.0。2,我正试图根据我找到的(很少)文档使用iron表单。 我的方法表单是“帖子”,只包含一个输入。 我的表单“action”是一个PHP脚本(add.PHP),显示$\u GET和$\u POST的内容: 我的表单组件(form_eclp.html)是: 我打电话如果从: 当我在名称输入中输入文本“测试”后点击提交按钮时,我可以在浏览器开发工具的网络选项卡中看到这是一个

  • 如何识别代码中的组合和聚合?特别是在为现有代码绘制类图时? 我知道组成是“HAS-a”关系,聚合是“PART OF”关系。我知道,在组合子类中,实例将随类一起销毁,而在聚合中则不会。 下面是一个 C/CLI 代码 报警 报警.cpp 据我所知,警报和通知之间的联系是组合,因为没有就没有。我说的对吗?如果我是对的,我怎样才能使这段代码在两个类之间具有聚合关系?请问那里的代码示例? 请帮忙。

  • 问题内容: 给定2种rgb颜色和一个矩形区域,我想在这些颜色之间生成基本的线性渐变。我已经进行了快速搜索,唯一能够找到的是此Blog条目,但示例代码似乎丢失了,或者至少是在发布此信息之时。任何帮助,算法,代码示例,等等。这将用Java编写,但是显示层已经处理完毕,我只需要弄清楚如何弄清楚要显示的内容。 问题答案: 您需要在第一和第二种颜色之间进行插值。通过为每个分量(R,G,B)计算相同的插值,可

  • 目前,我正在与spring integration合作开发新的应用程序,并启动了poc,以了解如何处理故障案例。在我的应用程序中,spring integration将接收来自IBM mq的消息,并根据消息类型验证头信息和到不同队列的路由。传入的消息可能是批量消息,所以我使用了spring integration的拆分器和聚合器,并且对技术工作流程有很好的进展和控制。目前我面临的问题很少,我们有I

  • 我用JavaFX编写了一个应用程序,它只能用于键盘的箭头。所以我在现场的舞台上阻止了MouseeEvent,我“倾听”关键事件。我还关闭了所有节点的聚焦: 现在我有了一些文本字段、复选框和按钮。我想更改输入控件的状态(文本字段,复选框,…)编程:例如,我想输入文本字段以编程方式编辑内容。所以我的问题是:如何输入非焦点可遍历的文本字段?因为textfield。requestFocus();自从我将f