我正在创建一个包含多种类型事件的事件系统,例如ExampleEvent extends Event
。我需要使用以下语法,通过lambda/consumer找出提供给钩子函数的事件类型:
hook(
(ExampleEvent e) -> e.example(),
(ExampleEvent2 e) -> // code here
);
这是我目前所拥有的,我需要将消费者添加到Map中,以便在每次调用事件时运行它们。有什么方法可以实现这一点吗?有没有更好的方法可以实现这一点?
static Map<Class, ArrayList<Consumer<? extends Event>>> hooks = new HashMap<>();
public static void hook(Consumer<? extends Event> ...consumers) {
for(Consumer<? extends Event > fn : consumers) {
final Class klass = // class supplied in lambda function
if(hooks.containsKey(klass)) {
hooks.get(klass).add(fn);
} else {
hooks.put(klass, new ArrayList<>(fn));
hooks.get(klass).add(fn);
}
}
}
public static void fire(Event event) {
ArrayList<Consumer<? extends Event>> classHooks = hooks.get(event.getClass());
if(classHooks == null) {
return;
}
for(Consumer c : classHooks) {
c.accept(event);
}
}
我尝试了一些方法,但找不到一种方法来使它工作。
1条答案
按热度按时间kse8i1jr1#
你需要放弃一次注册多个消费者的想法,一次注册一个消费者,为每个消费者提供事件类。下面是如何以类型安全的方式完成这件事: