Интересно, может ли кто-нибудь посоветовать какие-либо хорошие способы разорвать круговую зависимость между двумя классами в Java. FindBugs предлагает использование интерфейсов, поэтому мне интересно, есть ли у кого-нибудь хороший опыт решения этого типа проблемы.
Работа с круговой зависимостью
Ответы (3)
Не всегда следует избегать круговых зависимостей. Я бы избегал их в больших, но держал бы в маленьких узких углах системы. В целом, т.е. если уровень доступа к данным и уровень представления J2EE-приложения зависят от цикла, я бы сказал, что это плохо, потому что это означает, что все должно быть скомпилировано за один раз, а тестирование - это кошмар. Но это не проблема, если структура данных списка и ее тип итератора циклически зависимы.
Как предлагает Findbugs, используйте интерфейсы для разрыва круговой зависимости. То есть ввести интерфейс хотя бы для одного типа круга и заставить другие классы использовать интерфейс повсюду. Вам нужен пример кода?
Предложите прочитать о принципе инверсии зависимостей, например Что такое принцип инверсии зависимостей и почему он важно? или http://en.wikipedia.org/wiki/Dependency_inversion_principle
В блоге есть сообщение здесь о том, как Restructure101 использовался для удаления циклических зависимостей, "путаницы", от Junit и презентация из Lausanne JUG о том, как его использовали для удаления путаницы с Icefaces.
Что касается дискуссии о том, вредны ли циклические зависимости, я предлагаю прочитать Твердые принципы дяди Боба.
Отказ от ответственности: я работаю в Headway Software, разработчиках Restructure101.