java - 如何解决缺少包访问说明符的问题?

标签 java jar package encapsulation class-visibility

我是 Java 新手。我发现,在尝试构建我的代码时,Java 将源文件组织(目录结构)与包结构以及包结构与类的外部可见性紧密联系在一起(一个类要么对所有其他包可见,要么不可见)。

这使得将我的公共(public)库的内部实现细节组织成相关功能的逻辑单元,同时保持良好的封装变得相当困难。 JSR 294解释得最好:

Today, an implementation can be partitioned into multiple packages. Subparts of such an implementation need to be more tightly coupled to each other than to the surrounding software environment. Today designers are forced to declare elements of the program that are needed by other subparts of the implementation as public - thereby making them globally accessible, which is clearly suboptimal.

Alternately, the entire implementation can be placed in a single package. This resolves the issue above, but is unwieldy, and exposes all internals of all subparts to each other.

所以我的问题是,针对此限制有哪些解决方法,有哪些优点和缺点? JSR中提到了两个——使用包进行逻辑分组(违反封装);将所有东西放在一个包中(笨重)。这些解决方法还有其他优点/缺点吗?还有其他解决方案吗? (我已经模糊地意识到 OSGi bundle ,但我发现很难理解它们如何工作以及优点/缺点可能是什么(也许这是一个缺点)。它似乎是与普通软件包相比,对开发和部署来说非常具有侵入性。

注意:我会对任何好的答案投赞成票,但最佳答案将是全面考虑其他答案的优点和缺点的答案(抄袭!)。

相关(但不重复!)问题

期待“可能重复”的呼声,以下是我在 SO 上发现的类似问题;我在这里展示它们以供引用,并解释为什么它们没有回答我的问题。

最佳答案

ProGuard这样的工具可用于重新打包 JAR,仅公开您在配置文件中指定的那些类。 (除了优化、内联和混淆之外,它还执行此操作。)您可以在例如中设置 ProGuard Maven 或 Ant 构建,因此您可以编写公开方法的库,然后使用 ProGuard 将它们从生成的 JAR 中消除。

关于java - 如何解决缺少包访问说明符的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9611443/

相关文章:

java - 如何检查字符串数组中的元素是否为空?

java - 如何在我的 Java 项目中正确包含 Batik 库?

java - 如何在 Linux 中运行具有多个外部 Jar 文件的 Java 程序 [错误 : Could not find or load main class]

java - 可运行的 .jar 可在 Ubuntu 上运行,但不能在 Windows 上运行

python - 如何将静态文件包含到 setuptools - python 包

java - 在 twitter4j 中检索给定关键字的推文

java - Constraints-Mappings 文件中的 Hibernate Validator 类级约束

Java,创建一个对象 vector ,编译后其数组中应有n个零

java - 相同的包,不同的目录

javascript - 如何让 countUp Javascript 包正常工作?