我是 Java 新手。我在尝试构建我的代码时发现,Java 将源文件组织(目录结构)与包结构和包结构与类的外部可见性密切相关(一个类对所有其他包可见,或者不可见)。
这使得在保持良好封装的同时将我的公共库的内部实现细节组织成相关功能的逻辑单元变得相当困难。JSR 294解释得最好:
今天,一个实现可以分成多个包。这种实现的子部分需要更紧密地相互耦合,而不是与周围的软件环境耦合。今天,设计人员被迫将实现的其他子部分所需的程序元素声明为公开的——从而使它们在全球范围内可访问,这显然是次优的。
或者,整个实现可以放在一个单独的包中。这解决了上面的问题,但很笨拙,并且将所有子部分的所有内部都暴露给彼此。
所以我的问题是,这种限制存在哪些解决方法,优缺点是什么?JSR 中提到了两个——使用包进行逻辑分组(违反封装);把所有东西都放在一个包里(笨重)。这些变通办法还有其他优点/缺点吗?还有其他解决方案吗?(我已经模糊地意识到 OSGi 包,但我发现很难理解它们是如何工作的以及可能的优点/缺点是什么(也许这是一个缺点)。与香草包相比,它似乎非常具有侵入性,到开发和部署。
注意:我会投票赞成任何好的答案,但最好的答案将是一个综合考虑其他人的利弊的答案(抄袭!)。
相关(但不重复!)问题
期待“可能重复”的呼喊,这是我在 SO 上发现的类似问题;我将它们呈现在这里以供参考,并解释为什么它们不回答我的问题。
- Java:仅在 jar 文件中公开单个包:询问如何执行此操作,但鉴于在当前的 Java 版本中不可能,因此不讨论解决方法。对Java 8中即将到来的模块化(拼图项目)有有趣的指导。
- 包装和可见性- 基本上是上述重复问题。
- 控制对“.internal”包的访问的最佳实践——问题和答案似乎特定于 OSGi 或 Eclipse 插件。