如何在Java中实现实例的最终方法的侦听器

时间:2016-02-22 02:14:39

标签: java override listener final

我正在使用一个库,我想在其中一个方法上实现一个监听器。我的想法是扩展类并覆盖方法,但似乎我不能,因为该方法是最终的(对于静态方法看起来表现相似)。

如何在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类,因为它是外部库的一部分,并且分支它(假设这是可能的)意味着维护它。

3 个答案:

答案 0 :(得分:2)

在Java中,/META-INF/kmodule.xml方法无法被覆盖。使方法最终的目的是防止它被覆盖。

有关详细信息,请转到Writing Final Classes and Methods

答案 1 :(得分:2)

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

如果你想实现监听器,那取决于你是否真的需要从Copy扩展Original(即你真的需要用它代替Original) - 如果不是然后你可以简单地在Copy类上实现接口,或者有一个实现接口的包装类。

答案 2 :(得分:-2)

这取决于你想要做什么。但是,您可以按如下方式添加侦听器:

manager[1]