我希望在Java中实现一个可扩展的事件驱动架构。不幸的是,我无法完全使它类型安全。下面是我的做法。
首先,我定义了一个事件。它是一个几乎为空的类,可以被扩展。
public abstract class Event {
public final Class<? extends Event> getEventType() {
return this.getClass();
}
}
并且监听器:
public interface Listener<T extends Event> {
Class<T> getEventType();
void onEvent(T event);
}
到目前为止一切都很好。但是当我尝试实现事件分发器时,我卡住了。
public class EventDispatcher {
private Map<Class<? extends Event>, Collection<Listener>> listenersDict = new HashMap<>();
public void registerListener(Listener listener) {
Class<? extends Event> eventType = listener.getEventType();
Collection<Listener> listeners = listenersDict.get(eventType);
if(listeners == null) {
listeners = new ArrayList<>();
listenersDict.put(eventType, listeners);
}
listeners.add(listener);
}
public void dispatch(Event event) {
Class<? extend Event> eventType = event.getEventType();
Collection<Listener> listeners = listenersDict.get(eventType);
if(listeners != null) {
for(Listener listener : listeners) {
@SuppressWarnings("unchecked") // Necessary Evil?
listener.onEvent(event);
}
}
}
}
正如您所见,我必须使用
@SuppressWarnings
。我尝试了我能想到的每种方式,但无论是registerListener
还是dispatch
中的一个始终不安全。(在EventDispatcher
中将Listener
更改为Listener<Event>
或Listener<? extends Event>
并不起作用。我真的尝试过。)是否有可能实现具有相同灵活性(可扩展的事件和侦听器,一个单独的分派程序处理不同的侦听器),但没有不安全的代码的架构呢?