我知道在Java中我们不能扩展最终类。但是,有没有其他办法可以让我扩大最终课程的效果?相当于扩展Java中的最终类
因为我有一个最终的课程,满足了我所期望的要求,所以如果我能以某种方式重复使用它,那对我来说会有很大的帮助。
我知道在Java中我们不能扩展最终类。但是,有没有其他办法可以让我扩大最终课程的效果?相当于扩展Java中的最终类
因为我有一个最终的课程,满足了我所期望的要求,所以如果我能以某种方式重复使用它,那对我来说会有很大的帮助。
为最终课程创建包装?
事情是这样的:
class MyClass {
private FinalClass finalClass;
public MyClass {
finalClass = new FinalClass():
}
public void delegatingMethod() {
finalClass.delegatingMethod();
}
}
包装类像MyClass
将不被接受为FinalClass
一个实例。如果FinalClass
实现了任何接口,您可以在MyClass
中实现它们,以使类更相似。 FinalClass
的任何非最终父母也是如此;在这种情况下,您的MyClass
设计应该与那些父类兼容。
甚至可以在运行时使用反射来创建包装类。在这种情况下,您可以使用Proxy
class。请注意,代理类确实需要深入了解Java类型系统。
最简单的选择是编写一个封装器,其中包含最终类的实例作为成员变量,并充当最终类的代理。
这样,很容易覆盖或扩展最终类的方法。
实际上,只有被封装的类实现了某种接口/抽象类并且你可以提供一个包装器实例来代替原来的东西时,这才有效。如果你不能做到这一点,那么在重构原始文件时就很难做到这一点。 – 2010-01-28 08:07:43
当然,你不能用MyClass替换FinalClass的所有实例。但是你可以定义你自己的接口来把FinalClass包装到MyClass中。永远不要在MyClass之外引用FinalClass。 – Arne 2010-01-28 09:13:51
@ArneJan,你的意思是我不应该引用任何其他类中的'finalClass'字段吗?为什么? – 2013-07-15 14:34:19