Java包结构

4
作为最佳实践,较高级别包中的接口/类是否可以依赖于较低级别包中的接口/类?
例如: com.company.core.SomeClass 可以依赖于 com.company.core.apackage.AnotherClass 吗?
还是应该从另一方面推导出依赖关系?我正在尝试消除包之间的循环依赖。
4个回答

2

2
通常,包的用户可能对com.company.functionality.MainUse感兴趣,该功能使用com.company.functionality.implementationdetail.FiddleWithStuff实现,因此我认为您必须接受该方向上的依赖关系。
但是,另一个方向可能也是必要的,因为实现细节类可能需要实现作为功能接口的一部分的接口。
因此,不幸的是,我认为像这样严格的方向性并不能避免循环。

2

它们通常是相反的方向。com.mycompany.myproduct.Widget是一个接口,而com.mycompany.myproduct.fancy.Button实现了它。

然而,这个通用规则有很大的例外,并且没有理由认为它应该成为一条规则。

包本身只是文件夹,除了方法和字段的基本访问规则外。

更重要的是bundle之间的依赖关系,即(在其基本形式中)jars。如果jar A依赖于jar B,再依赖于jar C,再次依赖于jar A,这是一个真正的问题。如果您在同一个jar包中的包之间有相同的循环,可能会引起阅读或调试您的代码的人或精英主义者的挫败感,但并不是一个大问题。


1

当然,你正在使用所谓的自顶向下方法,一个包依赖于其子包,但反之不成立。

自底向上的方法则相反,一个包将依赖于其父级包,但反之不成立。

无论哪种方式都可以,只要你能够保持一致性,但是自顶向下方法更容易且更常见。


但这意味着我们不能在顶层包中拥有一些公共接口和工厂,而将私有实现放在某个较低级别的包中,这似乎是相当常见的。 - Voo
@ivo 您所说的“保持一致性”,是指整个项目还是仅限于该带有其子包的一个包? - James Dunn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接