在JAR文件中隐藏一些类真的不可能吗?

我希望不允许直接实例化课程,以使其更加灵活。该罐子只能看到工厂(或立面)。

除了解决这个问题之外,还有其他方法吗? (两个项目:第一个项目包含类(实现),另一个针对第一个的引用并包含工厂;后来仅引用第二个引用)

有帮助吗?

解决方案

我认为,如果您的公共工厂方法试图返回“隐藏”的东西,您将有编译器故障或警告。

不,您不能不重新实现自己的公共课程 ClassLoader 或使用OSGI或类似的东西。

您可以做的是将接口API与实现分开,例如,一个项目仅包含接口和另一个包含隐藏的孔子。但是,您仍然无法隐藏实现类。

其他提示

我知道您不是要隐藏实际的课程,而只是防止其在工厂课程之外的建设。我认为,通过在类构造函数中使用包装私有(默认)可见性可以很容易地实现。唯一的限制是,您需要将课程和工厂放在同一软件包中,因此在大型代码库中,可能会变得不必要地复杂。

如果我正确理解您的问题,您要确保库的用户被迫使用工厂实例化其对象而不是使用构造函数。

如我所见,有两种可能性,其中一种是愚蠢的,但在少数情况下是可用的,而另一种是最实用的,可能是最常用的方法。

  1. 您可以将所有课程私人内部类 工厂。如果您每个班级有一个工厂,这将起作用,但是如果您通过一个工厂管理了很多不同的课程,则几乎是可行的。
  2. 您可以使用 protected 访问修饰符以限制对类构造函数的访问。 这是常见的做法 使用时 工厂模式.

混淆 能帮你 不知何故.

使用标准classloaders一个普通的旧罐子文件,这是不可能的。 OSGI CAS这个概念是使其他捆绑包仅某些软件包,而不是其他捆绑包(即公共API和内部实施的分离)。

如果您是usinf Eclipse,则可以使用 这个

如果我说“不允许直接实例化以保持灵活性”时正确理解您,则正确执行的立面模式将处理此操作。

限制您要隐藏的所有类的构造函数以包装范围。将立面班级开放给公共范围。

http://mindprod.com/jgloss/packagescope.html

“如果您的班级中有变量或方法,您不希望班级的客户直接访问,请不要向公开,受保护或私人声明。由于Java的设计进行了监督,您可以' t明确声明默认的“软件包”可访问性。软件包的其他成员将能够看到它,但是包裹外继承的类的类不会。受保护的可访问性属性提供了更多的可见性。可见的方法是可见的。要继承类,即使不是同一软件包的一部分。软件包范围(默认)方法不是。这是受保护范围和软件包范围之间的唯一区别。”

您的问题有两种解决方案,这些解决方案不涉及将所有课程都放在同一软件包中。

首先是使用朋友登录器/朋友包 (实用API设计,Tulach 2008)中描述的模式。

第二个是使用OSGI。有一篇文章 这里 解释OSGI如何实现这一目标。

相关问题: 1, 2, 3, , 和 4.

您可以使用自定义类加载程序进行此类魔法,但是:

  • 正确的分离只能在由您的课堂装载机配备的项目中获得;
  • 创建这样的装载机的努力确实值得怀疑。

在这种情况下,我会做类似于我们在标准Java中看到的事情。埃及看 javax.xml.stream.XMLInputFactory 但是你有 com.sun.xml.internal.stream.XMLInputFactoryImpl. 。如果您写的话,这是完全可以编译的:

new com.sun.xml.internal.stream.XMLInputFactoryImpl()

尽管您几乎不会做到这一点:-)使用系统属性,您可能会控制正在加载的实际实现。对我来说,这种方法在许多情况下都很好。

我希望我能正确理解您的问题;)

干杯!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top