java - 如何在Java中实现实例的final方法的监听器

标签 java overriding listener final

我正在使用一个库,我想在其中一种方法上实现监听器。我的想法是扩展类并重写该方法,但看来我不能,因为该方法是最终的(它的行为似乎与静态方法类似)。

如何在 Java 中实现实例的 final方法的监听器?

这是一个演示我的问题的示例:

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();
            }
        }
    }
}
<小时/>

我知道无法覆盖 final方法(这就是错误消息所说的内容)。我正在寻找替代方案。

此外,如果可能的话,我想避免修改 Original 类,因为它是外部库的一部分,并且 fork 它(假设这是可能的)意味着维护它。

最佳答案

Java 中的 Final 方法旨在表明它不能被重写。所以理想情况下你不应该试图覆盖它。通常,如果您必须这样做,您可能需要重新考虑如何构建代码。

如果您想实现监听器,则取决于您是否确实需要从 Original 扩展的 Copy (即您确实需要使用它来代替 Original) - 如果没有,那么您可以简单地在 Copy 类上实现接口(interface),或者拥有一个实现该接口(interface)的包装类。

关于java - 如何在Java中实现实例的final方法的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35544771/

相关文章:

java - 向 v-ol3 (Openlayers4) 的 OLMap 添加新监听器

java - 击中请求时出现cors问题

java - 忽略其他类的 System.exit()

c++ - 标记为 `virtual final` 的基类方法是否会引入额外的开销?

oop - 扩展和覆盖有什么区别?

jquery - 当 .off() 嵌套在 .on() 内部时使用

java - Calendar.getInstance() 和 GregorianCalendar.getInstance() 之间的区别

java - 使用 avro 序列化将整个 Json 发送到 kafka?

c# - 重写属性 setter

android - 如何使用菜单项中的 switch case 启动不同的 Activity ?