Java 如何正确组织一组实现不同包中接口的具体类?

Java 如何正确组织一组实现不同包中接口的具体类?,java,oop,package,Java,Oop,Package,我已经定义了我的系统将依赖的接口: IMethodCall 我创建了一系列类,它们实现了IMethodCall: AbstractMethodCall ConstructorCall TargetConstructorCall VoidMethodCall TargetVoidMethodCall NonVoidMethodCall TargetNonVoidMethodCall 它们是实现的细节,我的系统不知道(或者至少不需要知道) 根据我当时手头的一组数据,选择实例化哪个实现背后有一些复

我已经定义了我的系统将依赖的接口:

IMethodCall
我创建了一系列类,它们实现了
IMethodCall

AbstractMethodCall
ConstructorCall
TargetConstructorCall
VoidMethodCall
TargetVoidMethodCall
NonVoidMethodCall
TargetNonVoidMethodCall
它们是实现的细节,我的系统不知道(或者至少不需要知道)

根据我当时手头的一组数据,选择实例化哪个实现背后有一些复杂的逻辑,因此我决定创建一个工厂,将所有这些逻辑分组到一个地方:

MethodCallFactory
我试图理解这里应该使用什么样的包结构。我最初的想法是将所有具体的类放在
methodCalls
包中,并将它们设置为受包保护的,这样就没有人知道它们的存在。然后我将
IMethodCall
MethodCallFactory
放在外部,这样系统的用户就可以使用它们了。问题是,如果我将具体类作为包保护,那么工厂也必须在它们的包中,这看起来有点奇怪,因为对于外部查看器来说,它看起来就像是一个只包含工厂的包


目前,我认为最好的折衷办法是将具体类作为公共类,但我想知道你们通常如何处理这种情况?

可以将工厂类和接口放在公共包中,将实现的类放在内部包中

不鼓励使用内部包,内部包中的类可以随时更改。用户应该调用公共包中的api

例如:

公共包是org.feeling.ui.dialogs


内部包是org.feeling.internal.ui.dailogs

当我面对这种情况时,我会将具体的实现类和工厂放在同一个包中,并将实现类包私有化

您提到,由于外界的观点,这种方法似乎很奇怪。我不同意外部用户不知道有实现类。大多数IDE将显示包中的类,即使它们不可访问。此外,如果程序员试图使用您的实现类,编译器将暗示该类存在,同时不允许访问


我也不同意一个只包含工厂和私有实现的包是奇怪的。这组类是紧密相关的,因此将它们集中在一个地方是合乎逻辑的。

公开它们有什么害处吗?公开它们的害处是它们可以直接访问,这显然是作者想要防止的,由于使用factory.Java的本质,它们之间没有任何区别。如果希望编译器强制实现的私密性,这种方法将不起作用。