Две библиотеки Java, импортирующие друг друга? - PullRequest
4 голосов
/ 12 января 2012

Я работаю над устаревшей платформой, и, очевидно, есть две библиотеки, которые взаимозависимы.Я имею в виду libA импорт из libB и libB импорт из libA.Сначала я думаю, что это ужасный дизайн, но зачем кому-то делать что-то подобное?Скорее, какие условия могут заставить кого-то написать это?

edit:

Каждая библиотека зависит от классов в другом, поэтому они импортируют пакеты и имеют другую библиотеку jar в своем пути сборки.

Ответы [ 4 ]

7 голосов
/ 12 января 2012

В этом случае это легче сделать, потому что обе стороны независимы.Если они не разговаривают друг с другом, нетрудно создавать циклы.Вы должны быть осторожны, чтобы избежать их.

Создание циклических зависимостей несложно.Посмотрите на саму Java: java.lang, java.util и java.io имеют циклы.Перестанете ли вы писать Java, потому что это так «ужасно»?

Это означает, что вы никогда не сможете использовать libA без libB и наоборот.Они стали одной большой библиотекой.То же самое с пакетами в Java и других системах: когда у вас есть цикл, вы должны использовать все эти пакеты вместе, как если бы они были одним.

парни , которые пишут Spring, платят многовнимание к циклам.Они разрабатывают и реорганизуют свои структуры, чтобы устранить их.

Итак, что в этом плохого?Юрген Хеллер говорит, что они плохие, и он прав.Но, с вашей точки зрения, какое зло постигло вас?Это означает, что вы должны использовать как при запуске, так и при тестировании.Вы не можете проверить класс A без класса B и наоборот, когда между ними есть цикл.Это усложняет тестирование и работу.

Вы можете выбрать альтернативу, у которой нет цикла.Если вы можете изменить источник, вы можете рефакторинг и поддерживать его.Но это все.

Вам следует проверить собственный код, чтобы убедиться, что вы сделали это для себя.IntelliJ имеет хорошие инструменты анализа, которые могут быть применены к базе кода.Проверьте это.

1 голос
/ 12 января 2012

При разработке lib A разработчик обнаружил, что класс Foo из lib B был полезен. И при разработке lib B разработчик обнаружил, что класс Bar из lib A. был полезен.

Я не говорю, что это мудро, но ваш вопрос спрашивает, почему кто-то так поступил. Это, вероятно, ответ.

0 голосов
/ 12 января 2012

Скорее всего, это будет неопытность.
Современные инструменты сборки, такие как Maven, исключают циклические зависимости между артефактами.

0 голосов
/ 12 января 2012

Обе библиотеки были написаны одновременно, возможно, разными разработчиками.Или один и тот же разработчик в разное время или разработчик, который рассматривал обе библиотеки как одну большую базу кода и не заботился о том, чтобы избежать циклических зависимостей.Например, им было довольно трудно писать что-то, что работало, не беспокоясь о тонкостях.

...