带类的循环引用的原因?

时间:2012-06-09 01:29:10

标签: java circular-reference

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

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:10)

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

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

最后,循环引用的一个常见情况是双向父子关系:父对象(例如UI面板)保存对其子对象的引用,并且每个子对象(例如按钮,表等)都包含对父母的引用。父母需要向孩子发送动机,告诉他们孩子的启用,禁用,可见或不可见;孩子可以通知父母需要调整大小,改变视觉状态等。

这最后一个例子可能类似于你的Creature-CreatureAI对:它们是分开的,因为它们的关注点不同,但是它们彼此有引用,因为它们需要在不同的任务上合作。

答案 2 :(得分:2)

自我参考或参考周期有多种原因

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

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

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

  • 或者,它可以简单地实现方便,或者是之前重构或代码库演变的历史人工制品。

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

答案 3 :(得分:0)

通常,这不是必需的,但为与对象一起使用的代码提供了高度便利。

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