如何将EventListener挂钩到Event类及其子类?

时间:2018-10-25 14:39:12

标签: java generics inheritance

假设我可以根据事件的EventListenerEventDispatcher添加Class<T>

private Map<Class<?>, Set<EventListener>> listenerSets;

public <E extends Event<E>> void addListener(EventListener<E> listener, Class<E> eventClass) {
    Set<EventListener> listeners = listenerSets.get(eventClass);
    listeners.add(listener);
}

要查找特定Event的所有添加的侦听器,我使用事件的类作为键来检索与之挂钩的所有侦听器的集合。

private void fire(Event event) {
    Set<EventListener> listeners = listenerSets.get(event.getClass());
    // ...
}

现在假设我有一个相关事件的抽象超类,例如OrderChanged作为OrderLineAdded的超类。一些听众可能只想知道订单何时更改,而无需了解具体信息。

我可以某种方式在这些超类上注册并在子类事件发生时触发侦听器吗?

1 个答案:

答案 0 :(得分:0)

我认为最好的选择是仅对listenerSets进行遍历,并找到为OrderChanged的超类注册的所有侦听器,并对其进行通知。

private void fire(OrderLineAdded event) {
    listenerSets.entrySet().stream()
    .filter( e -> e.getKey().isAssignableFrom( event.getClass() ) )
    .forEach( e -> {
        Set<EventListener> events = e.getValue();
    } );
} 

当然,您需要addListener之前OrderChanged