我正在使用一个库,我想在其中一个方法上实现一个监听器。我的想法是扩展类并覆盖方法,但似乎我不能,因为该方法是最终的(对于静态方法看起来表现相似)。
如何在Java中为实例的最终方法实现侦听器?
以下示例说明了我的问题:
public interface Listener {
void somethingHappened();
}
public class Original {
public final void override() {
System.out.println("original");
}
}
public class Copy extends Original {
private List<Listener> listeners = new ArrayList<Listener>();
public void addListener(Listener toAdd) {
listeners.add(toAdd);
}
@Override
public void override() { // offensive line: "Cannot override the final method from Original"
System.out.println("copy");
if (listener != null) {
for (Listener listener : listeners) {
listener.somethingHappened();
}
}
}
}
我知道无法覆盖最终方法(这就是错误消息所说的)。我正在寻找替代方案。
另外,如果可能的话,我想避免修改Original
类,因为它是外部库的一部分,并且分支它(假设这是可能的)意味着维护它。
答案 0 :(得分:2)
在Java中,/META-INF/kmodule.xml
方法无法被覆盖。使方法最终的目的是防止它被覆盖。
有关详细信息,请转到Writing Final Classes and Methods。
答案 1 :(得分:2)
Java中的最终方法旨在表明它无法被覆盖。理想情况下,你不应该试图覆盖它。通常,如果您必须这样做,您可能需要重新考虑如何构建代码。
如果你想实现监听器,那取决于你是否真的需要从Copy
扩展Original
(即你真的需要用它代替Original
) - 如果不是然后你可以简单地在Copy
类上实现接口,或者有一个实现接口的包装类。
答案 2 :(得分:-2)
这取决于你想要做什么。但是,您可以按如下方式添加侦听器:
manager[1]