Java编程体系结构-接口和实现的类应该在同一个包中吗?

Java编程体系结构-接口和实现的类应该在同一个包中吗?,java,architecture,package,Java,Architecture,Package,我真的很奇怪,把一个接口和一个(实现的)类放在同一个包中还是分开比较好。我通常把它们放在同一个包装里,因为我认为比较起来更方便 但几天前,我有机会使用apacheGenericObjectPool。然后我发现了这样一个包结构,如org.apache.commons.pool.impl 毕竟,我的问题是什么时候应该使用前一个,什么时候应该使用另一个。感谢您在advanced:D中的真诚回答:如果使用接口只是为了降低耦合,您可以将接口和实现放在同一个包中。如果您主要使用更多的接口实现,那么应该将它们

我真的很奇怪,把一个接口和一个(实现的)类放在同一个包中还是分开比较好。我通常把它们放在同一个包装里,因为我认为比较起来更方便

但几天前,我有机会使用apache
GenericObjectPool
。然后我发现了这样一个包结构,如
org.apache.commons.pool.impl


毕竟,我的问题是什么时候应该使用前一个,什么时候应该使用另一个。感谢您在advanced:D中的真诚回答:如果使用接口只是为了降低耦合,您可以将接口和实现放在同一个包中。如果您主要使用更多的接口实现,那么应该将它们放在单独的包中。这真的取决于你的设计,我不认为有一个严格的规则。一般来说,您应该尽可能简单地设计应用程序,然后再进行重构。因此,在开始时,您可以将实现放在同一个包中,并且只有在似乎需要时,才应该将其拆分。

组合的原则之一是将接口与其实现分离

因此,将接口及其实现约束到同一个包没有多大意义


(在我工作的系统上,接口被放置在一个公共区域中——松散地基于接口存储库的概念)。

如果您通过接口和类定义包的责任,那么您将尝试从具体实现中抽象出来。因此,包应该只包含公共类型

如果继续为包提供默认实现,我看不出有任何理由不将它们放在同一个包中。但我总是建议将您的实现放在一个单独的项目或更具体的项目中,以提供包的
API
,并将实现作为两个不同的工件(例如,jar文件)

通过这种方式,您可以支持抽象的以下重要方面:

  • 用另一个实现替换一个实现
  • 确保客户机代码只依赖于一个API,而不依赖于实现(通过只向客户机类路径添加API工件)

谢谢您的回答。然而,有没有更具体的理由让我不把它们放在一起?例如,这使得重构更容易。因为我完全同意你所写的,但不知何故,我觉得相反的方式更适合管理源代码(可能是我觉得eclipse project explorer以这种方式显示的原因。如果将它们放在同一个包列表中,看起来更短)。谢谢Michal。听到各种各样的意见真是太好了。简单是最好的!我还有一个问题,如果我添加一个抽象类,它应该在哪里?将它与实现类或接口放在一起?一如既往,没有教条,但通常当我创建一个抽象类时,我会有更多的后代。在这种情况下,如果每个后代都在不同的包中,那么我也将抽象类放在不同的包中。如果所有子体都在同一个包中,那么我将它们放在同一个包中。让我给你一个例子(下一篇文章)(…继续)如果你有一个几何图形的包,在一个抽象类中有共同的功能,那么把它们都放在一个包中是没有问题的。但是想象一下,您有一个大型系统,并且希望通过数据库中的内容来配置它的某些部分。然后,抽象类中的一个公共功能将位于非常不同的包中,而子类则位于不同的包中。同样,保持简单。如果将抽象类保存在不同的包中是合乎逻辑的,那么就这样做。但是如果你不确定,把所有的课程放在一个包里。谢谢。现在我明白了为什么apache以这种方式制作软件包