gpt4 book ai didi

java - 使用 java 中的通用处理程序处理事件

转载 作者:行者123 更新时间:2023-12-03 00:13:19 25 4
gpt4 key购买 nike

我编写了自定义调度/处理事件系统,通常如下所示:

事件处理程序接口(interface):

public interface EventHandler{
}

基本事件类:

public abstract class Event<H extends EventHandler> {
public static Class Type<H> { }
public abstract void dispatch(H handler);
}

处理程序管理器:

public class HandlerManager {
private Map<Event.Type, List<EventHandler>> map = new HashMap<Event.Type, List<EventHandler>>();
public void register(Event.Type<H> type, H handler) {
if(map.get(type) == null) { map.put(type, new ArrayList<EventHandler>()); }
map.get(type).add(handler);
}

public void fire(Event<H> event) {...}
...
}

一切工作正常,但我想使用类似的事件

public class DataChangeEvent<D> extends Event<DataChangeHandler<D>> {
public static final Type<?> TYPE = new Type<?>();
D data;
...
public void dispatch(DataChangeHandler<D> handler) {
handler.onDataChanged(this);
}
public D getData() { return data; }
}

public class DataChangeHandler<D> extends EventHandler {
void onDataChanged(DataChangeEvent<D> event);
}
现在,当我向管理器注册处理程序 DataChangeHandler 来生成字符串事件(例如整数事件)时,此注册处理程序将接收这两个事件,这会导致当我想要读取数据时发生 ClassCastException。我知道泛型没有一些特殊的类,并且尽管 DataChangeHandler 中定义了类型,但它们都存储在处理程序映射中的同一列表中。

有什么办法可以让它发挥作用吗?

最佳答案

这看起来真的是一个非常非常难闻的设计。为什么应该使用处理该类型事件的类来键入事件?那是倒退了。 EventHandler 的类型应包含其处理的事件类型。

所以我不太明白你实际上想要做什么,但我认为你基本上是在尝试这样做:

private Map<Class<?>, List<EventHandler>> map;
public <T> void register(Class<? extends T> typeFilter, EventHandler<T> handler) {
map.get(typeFilter).add(handler);
}


//...later
//safe since we used a generic method to add
@SuppressWarnings("unchecked");
public void fire(Event<?> event) {
for ( EventHandler handler : map.get(event.getClass()) ) {
handler.onDataChanged(event);
}
}

//or similarly:
@SuppressWarnings("unchecked");
public void fire(Event<?> event) {
for ( Class<?> type : map.keySet() ) {
if ( !type.instanceOf(event) ) continue;
for ( EventHandler handler : map.get(type) ) {
handler.onDataChanged(event);
}
}
}

这种类型的设计将过滤掉处理程序无法处理的事件。

关于java - 使用 java 中的通用处理程序处理事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3569216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com