Java 处理循环依赖关系

Java 处理循环依赖关系,java,circular-dependency,findbugs,spotbugs,Java,Circular Dependency,Findbugs,Spotbugs,我想知道是否有人能就打破Java中两个类之间的循环依赖性的好方法提供建议。FindBugs建议使用接口,因此我想知道是否有人对这类问题有很好的经验。建议阅读依赖倒置原理,例如,或有一篇博客文章,介绍如何使用Structure101从Junit中删除循环依赖项,“tangles”,以及如何使用它从Lossanne JUG中删除Icefaces中的tangles 至于循环依赖是否有害的争论,我建议阅读Bob叔叔的 免责声明:我为Headway软件工作,Headway软件是Structure101的开

我想知道是否有人能就打破Java中两个类之间的循环依赖性的好方法提供建议。FindBugs建议使用接口,因此我想知道是否有人对这类问题有很好的经验。

建议阅读依赖倒置原理,例如,或

有一篇博客文章,介绍如何使用Structure101从Junit中删除循环依赖项,“tangles”,以及如何使用它从Lossanne JUG中删除Icefaces中的tangles

至于循环依赖是否有害的争论,我建议阅读Bob叔叔的


免责声明:我为Headway软件工作,Headway软件是Structure101的开发者。

循环依赖并不总是可以避免的。我会在大范围内避免使用它们,但会在系统的小角落中使用。总的来说,如果J2EE应用程序的数据访问层和表示层依赖于循环,我会说这是一件坏事,因为这意味着所有内容都必须一次性编译,测试是一场噩梦。但是,如果列表数据结构及其迭代器类型是循环依赖的,则没有问题


正如Findbugs建议的那样,使用接口打破循环依赖。例如,为至少一种类型的圆引入一个接口,并使其他类在任何地方都使用该接口。您需要示例代码吗?

首先,循环引用有什么问题?你为什么要打破它们?也许你应该在你的问题中指出这一点。。。假设是我想要避免的反模式!出于教育目的,检查不同的设计可能性。!循环引用是反模式吗?谁说的?Java GC对实例没有问题(只有使用纯引用计数的GC才会有这样的问题),编译器在编译时也没有问题,只是您必须同时编译这两个类,因此编译器能够解决依赖关系。顺便说一句,你错过了一个重要的标签:java。我将为您修复标记。@Mecki:循环类依赖项与运行时对象图中的循环不同。我同意在可能的情况下应该避免循环类依赖关系,使用接口来打破依赖关系是一个很好的方法。@Chris:如果你给我们举一个循环依赖类的例子,我们可以给出更好的建议。+1。好的设计方法是好的,因为它有明显的好处。例如,在集合及其(惰性)迭代器的特定环境中,简单地引入一个新接口来打破循环是过分的。然而,我认为:只有在可以将除一个依赖项以外的所有依赖项作为内部类或嵌套类包含的情况下,才可以使用循环依赖项。事实上,通过以这种方式使用内部类,您可以通过使用内部类保留的隐式容器引用来避免许多循环依赖性警报。通过使用内部类的隐式引用,您可以避免工具警告,但您的代码仍然具有循环引用。但正如我所说的,我建议将圆圈尽量缩小——不要不惜一切代价避开它们。通过使用内部类可以做到这一点。可能是因为链接URL周围缺少上下文。鼓励进一步阅读URL,但答案应包含一些上下文和URL的本质。请参见:(提供链接的上下文)