【问题标题】:Reason for circular references with classes?类循环引用的原因?
【发布时间】:2012-06-13 00:50:47
【问题描述】:

我知道循环引用(A 类拥有 B 类,B 类拥有 A 类)。但是由于我的编程不够,我很难找到使用它们的理由。我想知道人们是否可以给我一些例子并解释使用它们的充分理由。

就我而言,现在我正在查看 2D 源代码教程,并且用户创建了一个相互引用的 Creature 和一个 CreatureAi 类。是什么原因?我还不知道,这就是为什么我正在寻找示例并仍在阅读的原因。

【问题讨论】:

    标签: java circular-reference


    【解决方案1】:

    您有一个 Company 类,其中包含为其工作的个人列表。集合中的每个 Individual 类实例都包含对其工作的公司的引用。

    通过这种方式,您可以轻松找出哪些人为哪些公司工作。请注意,它可能不一定是最好的设计,尤其是如果使用 ORM 或文档数据库将类持久化到数据库中。

    【讨论】:

    • 如果您使用 OrmLite,您必须在代码本身中指定外部关系,它实际上可能是 only 设计。但是是的,我也不喜欢它。
    【解决方案2】:

    循环引用最明显的例子是自引用:链表、树和许多其他递归结构都需要它。

    循环引用通常隐含在相关类的层次结构中,例如具有任意嵌套的 UI 元素或表达式树。

    最后,循环引用的一个常见情况是双向父子关系:父级(例如 UI 面板)持有对其子级数组的引用,每个子级(例如按钮、表格等)持有一个对父级的引用。父母需要向其孩子发送主题信息,告诉他们它已启用、禁用、可见或不可见;孩子可能会通知父母需要调整大小、更改视觉状态等。

    最后一个示例可能类似于您的 Creature-CreatureAI 对:它们是独立的,因为它们的关注点不同,但它们相互引用,因为它们需要在不同的任务上进行合作。

    【讨论】:

      【解决方案3】:

      通常它不是绝对必要的,但为使用对象的代码提供了高度的便利。

      其他时候,确实需要。例如,有些关系需要在代码中表示为数据结构,并且关系是自反的。

      【讨论】:

        【解决方案4】:

        自引用或引用循环有多种原因

        • 它们可能是域模型中固有的;例如人们有孩子,他们也是人,文件夹包含其他东西,包括其他文件夹。自引用或循环是实现这些东西的自然方式。

        • 它们可能是通用或应用程序特定数据结构所固有的;例如。链表由节点组成,这些节点包括对列表中“下一个”和“上一个”节点的引用,这需要 Node 类引用自身。

        • 循环引用背后的推理可能是应用程序设计的基本部分。

        • 或者,它可能只是一种实现便利,或者是以前重构或代码库演变的历史产物。

        基本上,您需要(全面地)查看应用程序代码库,以找出这些循环依赖项存在的原因......以及它们是否真的有必要。

        【讨论】:

          猜你喜欢
          • 2017-03-20
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多