具有私有依赖类的Java公共类

时间:2010-12-17 22:42:35

标签: java

在Java中一直困扰我的一件事是:

如何创建一个应该由下游消费者使用的单个公共类,然后很好地组织它依赖于包中的类?

例如(有点人为),我有一个依赖于LdapPersistenceHelper和DBPersistenceHelper的UserDao类。 UserDao类位于一个名为com.company.dao的包中,我希望这两个帮助程序位于一个名为com.company.dao.persistencehelper的包中。但是,我不想让这两个助手足够通用,以便其他人可以使用它们。我怎么样?如果我让帮助者“受保护”(真的,没有修饰符),那么我无法从UserDao到达它们。如果我公开,其他人可能会使用它们。

5 个答案:

答案 0 :(得分:6)

根本问题是你正在尝试使用软件包“很好地组织事情”。创建Java包时,有两个设计目标:(1)全局唯一类命名,以及(2)促进使用protected / default访问修饰符。

您被限制为具有与包匹配的源文件夹结构的事实不可避免地导致尝试使用它们来创建“漂亮/有组织的文件夹结构”。但这不是它的创建原因,因此,它不能很好地利用它所支持的访问修饰符。

编辑:顺便说一句,我不是以某种方式传递判断力。我意识到我的第一句话可能听起来很关键。许多项目合法地选择有组织和可维护的结构,而不是试图从受保护的访问中挤出一些额外的感知价值。如果帮助程序实用程序是公共的,那真的很糟糕吗?如果你不相信其他开发者有权不滥用它,他们是否可以信任不仅仅改变访问修饰符?

答案 1 :(得分:3)

除非您将类放在同一个包中,否则无法强制执行此操作。无法定义子包可见性。

答案 2 :(得分:1)

一种选择是将它们放在与公共类相同的包中,但具有包访问权。

如果您使用的是OSGi,则可以将实施包从导出的包中删除。

答案 3 :(得分:1)

我不担心其他人使用它们。只需将它们记录为内部包,甚至可以将它们放在“内部”或“impl”包下。如果有人不恰当地使用它们,它们只能伤害和责备自己(唯一的伤害可能是处理这些类的向后不兼容的更改)。

如果您想要更强的隔离,请使用OSGi。

答案 4 :(得分:1)

注意:解决此问题的一种可能方法(如果您要分发JAR以供其他人使用)是使用混淆器(我建议ProGuard)来混淆非公开消费类;再次,这并不能防止故意渎职,但它很清楚,下游与这些类的兼容性没有合同(这使得在技术上很难弄清楚如何使用它们)。