如何让两个不同的包访问彼此的类,而不允许任何其他第三个包在java中访问它?

时间:2015-07-02 07:09:52

标签: java package share encapsulation package-private

我正在netbeans中创建一个项目,并面临类似于本网站上已经提出的问题的问题 - How to share package private data between two packages in Java?,稍微区别一点,就是说应用程序开发人员可以看到我的代码库。我认为在包B中创建一个公共类说'communicator class',它的构造函数具有默认的包访问权,并在包A的类的构造函数中传递它的实例。基本上我停止开发人员(使用包C)实例化包A中的任何类都可以。但是,这不是一个好的方法。除了三年前提出这个问题。现在是否有更好的方法/技术可用于NEAT和/或包A和B之间的耦合较少。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

您是否试图防止故意或意外滥用这些包裹?

如果您试图防止故意滥用,您的方法将无法完全解决;因为反射可以用于覆盖方法/构造函数/等的访问。 e.g。

Communicator communicator = ...;

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

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

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

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

如果您只是试图防止意外滥用,,您可能最好依赖程序包命名,以便向不应该使用该类的人员说明。例如package foo.bar.internal;

您的团队/公司以外的人员将使用这些包吗?

如果您对将使用您的代码的模块的构建环境有一些影响,您可以考虑在构建配置中添加工具以禁止使用您的私有软件包。例如,Checkstyle's Import Control check可以很好地控制从哪里导入哪些包。