我正在开发一个遗留框架,显然有两个库是相互依赖的。我的意思是libA
从libB
导入,libB
从libA
导入。首先,我认为这是一个糟糕的设计,但为什么有人会这样做?而不是哪些条件可以导致某人写这个?
编辑:
每个库都依赖于另一个库中的类,因此它们会导入包并在其构建路径中包含另一个库jar
。
答案 0 :(得分:7)
在这种情况下,这样做更容易,因为双方是独立的。如果他们不相互交谈,那么创建周期并不困难。你必须注意避免它们。
循环依赖关系并不难创建。看看Java本身:java.lang,java.util和java.io有循环。你会不会再写Java了,因为它太“糟糕”了?
这意味着你永远不能在没有libB的情况下使用libA,反之亦然。他们已成为一个大型图书馆。与Java和其他系统中的软件包相同:一旦你有一个循环,你必须像使用它们一样使用所有这些软件包。
编写Spring的guys非常关注周期。他们设计并重构他们的框架以消除它们。那么 - 有什么危害? Juergen Heller说他们很糟糕,他是对的。但是从你的角度来看,你遇到了什么罪恶?这意味着您必须在运行和测试时同时使用它们。当它们之间存在循环时,您无法在没有B类的情况下测试A类,反之亦然。它使测试和运行更加困难。
您可以选择没有周期的替代方案。如果您可以更改源,则可以重构和维护它。但就是这样。
您应该检查自己的代码,看看您是否已经完成了自己的代码。 IntelliJ具有很好的分析工具,可以应用于代码库。看看吧。
答案 1 :(得分:1)
在开发lib A时,开发人员发现lib B中的类Foo很有用。在开发lib B时,开发人员发现lib A中的类Bar非常有用。
我不是说这是明智之举,但你的问题是为什么有人会这样做。这可能就是答案。
答案 2 :(得分:0)
两个库都是在同一时间编写的,可能是由不同的开发人员编写的。或者是不同时间的同一个开发人员,或者是将两个库视为一个大代码库的开发人员,并且不关心避免循环依赖。例如他们有足够的时间写一些有用的东西而不用担心细节。
答案 3 :(得分:0)
很可能是缺乏经验 像Maven这样的现代构建工具排除了工件之间的循环依赖关系。