我正在做一个图书馆。我有三个包:
电子表格是主要的包。 io包是内部包,供内部使用。不幸的是,用户可以访问它们,因为它们是公共类。
我想保留这个包,因为它允许我在编程时分离概念,但我想将这些类“隐藏”给最终用户。
我能做什么?
你问自己这个问题真好!我最近没有注意到这一点。
由于OdsReader
和OdsWriter
仅在Spreadsheet
类中使用,只需将它们移动到spreadsheet
包内,移除public
可见性关键字。它们现在只能从spreadsheed
包的类中访问。
上面提出的解决方案对于你的用例来说过于复杂,而且使用Java 9+
模块(或OSGi - 请不要!),这里并不是真的有必要,但它是保持定义私密和密封的一步之遥。 ,甚至对Reflection
滥用者。
作为旁注,我看到你有一个exceptions
包。
我从不建议这样做,因为你必须将这些异常的构造函数暴露给代码的用户,并且他们将能够无缘无故地实例化它们。
移动使用它们的包内的异常,并将构造函数声明为包private。
从java9开始,您可以将此库转换为模块。见this jigsaw tutorial。
模块需要导出包以便可以从其他模块访问其公共成员:只是不要导出内部包,它将不可见。
你也可以选择类似OSGi的东西,这是一个早于java9的模块系统。它也有这样一个概念,即超出公众的水平(我们称之为'可见')。
最后一个选项是使用classloader shenanigans(例如,您在构建阶段将类文件重命名为其他扩展名,并在可见包中有一个小型引导程序,它创建一个类加载器,通过查看与之相同的位置来加载类。可见的API,然后使用替代扩展加载文件,并将defineClass
加载到存在),但这是一个引起相当多头痛的重大步骤。我不会接受它,除非你有充分的理由去这个兔子洞。