Как я могу подключить EventListener к классу Event и его подклассам? - PullRequest
0 голосов
/ 25 октября 2018

Предположим, я могу добавить EventListener к EventDispatcher на основе 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, я использую событиеclass в качестве ключа для получения набора всех прослушивателей, подключенных к нему.

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

Теперь предположим, что у меня есть абстрактный суперкласс для связанных событий, например OrderChanged в качестве суперкласса OrderLineAdded.Некоторым слушателям может потребоваться узнать только, когда меняется порядок, без необходимости знать особенности.

Могу ли я каким-либо образом зарегистрироваться на этих суперклассах и вызвать слушателей в случае возникновения события подкласса?

1 Ответ

0 голосов
/ 25 октября 2018

Я думаю, что лучший вариант - просто перебрать 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 заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...