2011-03-30 139 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