作为一种最佳实践,高级包中的接口/类是否可以依赖于较低级别包中的接口/类?
e.g。
可以com.company.core.SomeClass
取决于com.company.core.apackage.AnotherClass
或者依赖关系应该以另一种方式流动?我试图消除包之间的循环。
答案 0 :(得分:2)
即使在Java API本身中,这种依赖也很常见。
请注意:http://download.oracle.com/javase/6/docs/api/java/awt/image/renderable/package-use.html
您可以在java.awt
中看到java.awt.image.renderable
中的类使用类。
(ADDENDUM)底线:实际使用两个方向。一个不是,恕我直言,一定比另一个好。
答案 1 :(得分:2)
通常,程序包的用户可能对使用com.company.functionality.MainUse
实现的com.company.functionality.implementationdetail.FiddleWithStuff
感兴趣,所以我要说你必须接受该方向的依赖关系。
但另一方面可能也是必要的,因为实现细节类可能需要实现作为功能接口一部分的接口。
所以,不幸的是,我认为像这样严格的方向性并不是避免循环的可行方法。
答案 2 :(得分:2)
他们通常以另一种方式流动。 com.mycompany.myproduct.Widget是一个接口,com.mycompany.myproduct.fancy.Button实现了它。
这个一般规则有很多例外,并且没有理由说它应该成为规则。
除了方法和字段的原始访问规则外,包本身只是文件夹。
更重要的是捆绑之间的依赖关系,即(基本形式)jar。罐子A取决于罐子B,取决于罐子C,再次依赖罐子A是一个真正的问题。如果同一个jar中的包之间有相同的圆圈,则会导致读取或调试代码的人或读取它的精英人员感到沮丧,但这不是一个大问题。
答案 3 :(得分:1)
当然,你正在使用所谓的自上而下的方法,一个包依赖于它的子包,但反之亦然。
自下而上的方法将是另一种方式,一个包将取决于其父包,但反之亦然。
只要您能够保持一致性,这两种方式都可以,但自上而下的方法更容易也更常见。