java - 如何在 Java 中的两个包之间共享包私有(private)数据?

标签 java package share encapsulation package-private

我有 2 个 Java 包,A 和 B。假设包 B 中的一些类想要使用包 A 中的一些类,但是,当开发人员出现并开发包 C(或者说,应用程序 C)时,他/她将使用我的包 B,但我希望他/她能够使用 B 正在使用的 A 中的类。也就是说,我希望包 A 中的类是包私有(private)的,这样它们对应用程序开发人员是隐藏的。但是,我确实希望我自己的包 B 能够访问那些包私有(private)的类。这可以用 Java 完成吗?我基本上只需要硬着头皮公开这些类,只希望用户不要尝试使用它们吗?或者,我是否需要在 B 中复制 A 中的类?

我的偏好是不是 hack-y 的东西(即我不想使用反射)。帮忙?

最佳答案

您可以使用 JDK 8 来完成及其 Project Jigsaw .您可能想看看 Project Jigsaw Quickstart Guide .

不幸的是,Jigsaw 是 JDK8 的一部分,它还没有完全准备好。预计功能不完整 until January 2013并且不会在 2013 年年中之前发布。

但是,您已经可以使用 JDK 8 预览版编译您的类并实现您的想法。

在这种情况下,您的问题可以通过将您的应用程序划分为独立的模块来解决。你可以这样做:

module foo {
    exports foo;
    permits bar;
    permits baz;
}

这里只有名为 bar 或 baz 的模块才需要模块 foo。来自某个其他名称的模块对 foo 的依赖在编译时、安装时或运行时将无法解析。如果不存在许可条款,则不存在此类约束。

不确定是否有像 OSGI 这样的替代框架,您可以在 Apache Felix 中找到实现和 Eclipse Equinox提供某种功能来实现这些级别的封装。您可能想要对此进行一些调查。

OSGi 的问题如果 Jigsaw 不存在,框架强制执行的任何规则都可以通过反射来打破,但是一旦 Jigsaw 准备好供公众使用,这些规则将由 Java 本身强制执行,正如您在上面读到的那样,在编译时、运行时和安装时时间。

关于java - 如何在 Java 中的两个包之间共享包私有(private)数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10989881/

相关文章:

android - 从共享 Intent 选择器中获取选定的应用程序名称?

Java 让用户创建和执行算法

java - 更改 Android Studio 中 android.util.Log 的自动导入 "unambiguous"

macos - Productsigned Mac 应用程序未安装在非我的计算机中

python - 如何使用 yum python API 列出、添加和删除存储库?

node.js - 管理 2 个以上具有依赖关系的 Nodejs 包的开发

image - 无法使用Flutter channel 共享文件-缺少插件异常

ios - 使用 facebook sdk 4.0 + iOS 分享内容

java - 了解按位运算及其在 Java 中的应用

java - 在 Java 中将数据从 InputStream 管道传输到 OutputStream