0

我正在 netbeans 中制作一个项目,并面临与本网站上已经提出的问题类似的问题 - 如何在 Java 中的两个包之间共享包私有数据?,与假设应用程序开发人员可以看到我的代码库略有不同。我的想法是让包 B 中的公共类说“通信器类”,其构造函数具有默认包访问权限并将其实例传递给包 A 的类的构造函数。基本上我正在阻止开发人员(使用包 C)实例化包 A 中的任何类。这会起作用,但是我猜这不是 SE 的好方法。此外,这个问题是三年前提出的。现在有没有更好的方法/技术可用,它是 NEAT 和/或涉及更少的包 A 和 B 之间的耦合。

PS:我是java新手。任何帮助,将不胜感激。

4

2 回答 2

0

您可以引入一个模块,该模块具有其他两个包的引用,并使该模块充当桥梁。这是在 Java 8 之前可以完成的一件事

于 2015-07-02T07:33:21.420 回答
0

我相信你的方法会奏效,但你应该问问自己这是否值得。它会影响代码的可读性。

您是否试图防止对这些软件包的故意或意外滥用?

如果您试图防止故意滥用,您的方法不会完全解决它;因为反射可用于覆盖对方法/构造函数/等的访问。例如

Communicator communicator = ...;

Constructor<ObjA> constructor = ObjA.class.getConstructor(Communicator.class);
constructor.setAccessible(true);
ObjA objectFromA = constructor.newInstance(communicator);

如果您可以控制 Java 运行时,那么可以使用安全管理器来防止这种事情发生。

也可能有一些事情可以用 ClassLoaders 来控制一个模块对另一个模块的访问。一个类使用自己的 ClassLoader 加载其他类;自定义 ClassLoader 可以防止访问另一个模块的私有部分。这是(我相信)OSGi 如何控制模块之间的访问。

涉及安全管理器或类加载器的解决方案需要您对所使用的 java 运行时进行一些控制。

如果您只是想防止意外误用,您最好依靠包命名来让人们清楚他们不应该使用这些类。例如package foo.bar.internal;

您的团队/公司以外的人会使用这些软件包吗?

如果您对将使用您的代码的模块的构建环境有一些影响,您可以考虑在构建配置中添加工具以禁止使用您的私有包。例如Checkstyle 的 Import Control 检查对可以从何处导入哪些包提供了很多控制。

于 2015-07-06T19:11:12.030 回答