Java中的通用回调

时间:2013-03-06 23:58:55

标签: java generics callback

可以用作通用回调机制的优先Java接口或类似模式应该是什么?

例如,它可能类似于

public interface GenericCallback
{
    public String getID();
    public void callback(Object notification);
    // or public void callback(String id, Object notification);
}

对于覆盖hashCode()方法的情况,将需要ID,以便被调用者识别调用者。

如上所述的模式对于需要向条件(例如,处理结束)生成的类报告的对象非常有用。

在这种情况下,&#34;父母&#34; class会使用每个getID()对象的GenericCallback方法在Map<String, GenericCallable>中跟踪它们,并根据收到的通知添加或删除它们。

此外,如何实际命名这样的接口?

许多人似乎更喜欢Java Observer pattern,但定义的Observable class不方便,因为它不是绕过单一继承的接口,它带有比上面实际需要的功能更多的功能,简单场景。

3 个答案:

答案 0 :(得分:21)

我会根据传递的Object类型对回调进行泛化。这对于侦听不同类事件的EventListener特别有用。 e.g。

public interface Callback<T> {
   public void callback(T t);
}

可以能够使用类型T作为地图中的键。当然,如果你想区分两个采用相同参数的回调,比如String,那么你需要像getID()这样的东西。

Here my old blog about using this for Event Listeners界面Events.Listener对应上面的Callback<T>Broadcasters使用Map根据接受的类作为参数来跟踪多个侦听器。

答案 1 :(得分:4)

我建议使用观察者模式,因为观察者模式是解耦的黄金标准 - 相互依赖的对象的分离。

但如果您正在寻找通用的回调机制,我建议您避免使用 Java.util.Observable类。因为Observable有一些缺点:它不是一个接口,并强迫你使用Object来表示事件。

您可以像这样定义自己的事件监听器:

public class MyEvent extends EventObject {
    public MyEvent(Object source) {
        super(source);
    }
}

public interface MyEventListener {
    void handleEvent(EventObject event);
}

public class MyEventSource {
    private final List<MyEventListener> listeners;
    public MyEventSource() {
        listeners = new CopyOnWriteArrayList<MyEventListener>();
    }
    public void addMyEventListener(MyEventListener listener) {
        listeners.add(listener);
    }
    public void removeMyEventListener(MyEventListener listener) {
        listeners.remove(listener);
    }
    void fireEvent() {
        MyEvent event = new MyEvent(this);
        for (MyEventListener listener : listeners) {
            listener.handleEvent(event);
        }
    }
}

答案 2 :(得分:1)

看起来好像要实现Observer模式。在this url中是Java中观察者模式的完整实现。在你的情况下,观察者将是回调。

另外如果你需要实现更复杂的东西,你最终会做一个事件/通知模式。看一下这个其他模式here

谢谢, @leo。