我有一个关于偷偷摸摸地获取对我发生的包访问成员的访问权限的问题。具体来说,我想扩展一个类 - 让我们称之为com.acme.Foo
- 来添加一些功能。这是纯粹的补充:只有通过委托超类的方法才能支持Foo
的所有当前方法。但是,Foo
没有可访问的构造函数,因此我无法扩展该类,并且我的实现不会通过" isA"测试为Foo
。没有表达Foo
的接口 - 我可以使用而不是继承。
这是我想到的一个偷偷摸摸的想法:Foo
有一个包访问构造函数,所以为什么不在我的源文件夹中创建一个包com.acme
并创建一个InheritableFoo
类在那个包中:
package com.acme;
public class InheritableFoo extends Foo {
public InheritableFoo() {
super();
}
}
现在我可以通过扩展Foo
来实现我对InheritableFoo
的扩展,因为它有一个可访问的构造函数。
这种感觉完全错了,而且有点不道德:我不尊重原始程序员在决定不公开Foo
的构造函数时做出的决定。但可能的情况是,他们只是采用了“拒绝一切”,直到有了它的理由。做法。无论哪种方式,这个想法有什么根本的错误吗?如果我走这条路,我将来会给自己带来问题,如果是的话,为什么?
答案 0 :(得分:1)
你可以"潜行"这是正确的。在您自己的类中进入另一个包并获取对包受限元素的访问权。
只有com.acme.foo
的作者将其代码作为源或未密封的包分发时,才会这样做。如果这个软件包的作者将它分发为密封罐(我相信这很常见),你的方法就不再适用了。
来自Sealing Packages within a JAR File
JAR文件中的包可以选择性地密封,这意味着 该包中定义的所有类必须存档在同一个JAR中 文件。