2011-03-30 99 views
8

我不知道是否有人可以建议任何好的方法来打破Java中的两个类之间的循环依赖关系! FindBugs提出使用接口,所以我想知道是否有人有这种类型的问题有任何好的经验!处理循环依赖

在此先感谢!

+1

循环引用首先出现了什么问题?你为什么想要打破它们?也许你应该在你的问题中指出这一点。 – Mecki 2011-03-30 17:59:06

+1

好吧,我不知道...假设是我想避免的反模式!并为教育目的,检查不同的设计可能性。 – tropicana 2011-03-30 18:03:02

+0

循环参考是一种反模式?谁说的? Java GC对于实例来说没有问题(只有使用纯引用计数的GC才会有这样的问题),编译器在编译时没有问题,除了必须同时编译两个类以外,所以编译器能够解决依赖关系。顺便说一句,你错过了一个重要的标签:java。我会为你修复标签。 – Mecki 2011-03-31 11:48:21

回答

5
+0

Downvoter--为什么? – andersoj 2012-03-04 23:38:56

+0

可能是因为您的链接网址缺少上下文。鼓励URL进一步阅读,但答案应包含一些上下文和URL的本质。请参阅:http://stackoverflow.com/help/how-to-answer(为链接提供上下文) – sceiler 2016-05-19 06:59:59

2

有上Restructure101如何用于去除循环依赖,“缠结”,从Junit的博客文章here从洛桑士它是如何用来从ICEfaces的去除缠结一个presentation

至于关于循环依赖关系是否不好的争论,我建议您阅读Bob叔叔的Solid Principles

声明:我为Headway Software为Restructure101的开发人员工作。

6

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

由于Findbugs建议使用接口来打破循环依赖。我为至少一种类型的圆引入了一个接口,并使其他类在各处都使用接口。你需要示例代码吗?

+0

+1。凭借明确的优势,良好的设计方法是很好的。例如,在一个集合和它的(惰性)迭代器的特定情况下,简单地引入一个新的接口来打破这个循环是过度的。但是,我会争辩说:只有在可以将所有依赖关系都包含为内部或嵌套类的情况下,才使用循环依赖关系。事实上,通过以这种方式使用内部类,您可以通过使用内部类所保留的隐式容器引用来避免许多循环依赖性警报。 – 2011-10-05 16:30:31

+0

通过使用内部类的隐式引用,您可以避免使用工具警告,但是您的代码仍然具有循环引用。但正如我所说,我建议尽可能减少圈子 - 不要不惜一切代价避免它们。通过使用内部类,你可以做到这一点。 – jmg 2011-10-06 08:21:21