如何制作私人包裹?

问题描述 投票:0回答:2

我正在做一个图书馆。我有三个包:

enter image description here

电子表格是主要的包。 io包是内部包,供内部使用。不幸的是,用户可以访问它们,因为它们是公共类。

我想保留这个包,因为它允许我在编程时分离概念,但我想将这些类“隐藏”给最终用户。

我能做什么?

java intellij-idea jar
2个回答
1
投票

你问自己这个问题真好!我最近没有注意到这一点。

由于OdsReaderOdsWriter仅在Spreadsheet类中使用,只需将它们移动到spreadsheet包内,移除public可见性关键字。它们现在只能从spreadsheed包的类中访问。

上面提出的解决方案对于你的用例来说过于复杂,而且使用Java 9+模块(或OSGi - 请不要!),这里并不是真的有必要,但它是保持定义私密和密封的一步之遥。 ,甚至对Reflection滥用者。


作为旁注,我看到你有一个exceptions包。 我从不建议这样做,因为你必须将这些异常的构造函数暴露给代码的用户,并且他们将能够无缘无故地实例化它们。

移动使用它们的包内的异常,并将构造函数声明为包private。


1
投票

从java9开始,您可以将此库转换为模块。见this jigsaw tutorial

模块需要导出包以便可以从其他模块访问其公共成员:只是不要导出内部包,它将不可见。

你也可以选择类似OSGi的东西,这是一个早于java9的模块系统。它也有这样一个概念,即超出公众的水平(我们称之为'可见')。

最后一个选项是使用classloader shenanigans(例如,您在构建阶段将类文件重命名为其他扩展名,并在可见包中有一个小型引导程序,它创建一个类加载器,通过查看与之相同的位置来加载类。可见的API,然后使用替代扩展加载文件,并将defineClass加载到存在),但这是一个引起相当多头痛的重大步骤。我不会接受它,除非你有充分的理由去这个兔子洞。

© www.soinside.com 2019 - 2024. All rights reserved.