是否真的不可能在jar文件中隐藏某些类?
我不想允许直接实例化类,以使其更加灵活。该罐子只有工厂(或外墙)可见。
除了创建两个项目,除了解决此问题还有其他方法吗?(两个项目:第一个项目包含类(实现),另一个项目引用第一个项目并包含工厂;稍后仅引用第二个项目)
我想如果您的公共工厂方法尝试返回“隐藏”的东西,您将遇到编译器故障或警告。
否,如果不重新实现自己的ClassLoader
或使用OSGi或任何类似的东西,就不能隐藏公共类。
您可以做的是将接口api与实现分开,例如有一个仅包含接口的项目,而另一个包含实现的项目。但是,您仍然无法隐藏实现类。
我了解您不是要隐藏实际的类,只是要防止在工厂类之外构造它们。我认为可以通过在类构造函数中使用包私有(默认)可见性来轻松实现。唯一的限制是您需要将类和工厂放在同一个程序包中,因此在中型到大型代码库中,事情可能变得不必要地复杂。
如果我正确理解了您的问题,您希望确保库的用户被迫使用工厂来实例化其对象,而不是自己使用构造函数。
正如我所看到的,有两种可能性,一种是愚蠢的,但在少数特定情况下可用,另一种是最实际且可能是最常用的方式。
protected
访问修饰符限制访问您的班级构造函数。 这很常见练习在使用factory
pattern时。Obfuscation可以帮助您以某种方式>>。
对于标准类加载器和普通的旧jar文件,这是不可能的。 OSGi的概念是仅使某些软件包对另一个捆绑包可见(即,将公共api和内部实现分开)。
如果您说“不允许直接实例化类以使其更加灵活”,如果我理解正确,那么正确执行的外观模式将对此进行处理。
您的问题有两种解决方案,不涉及将所有类都放在同一包中。
您可以使用自定义类加载器来完成这些魔术,但是: