简体   繁体   English

使用泛型处理事件

[英]Using generics to handle events

I have several events (and listeners for each). 我有几个事件(每个都有监听器)。 I'd like to, instead of this: 我想代替这个:

private void alertListeners(EventType1 ev){
    for(EventType1Listener el : et1Listeners){
        el.handle(ev);
    }
}
private void alertListeners(EventType2 ev){
    for(EventType2Listener el : et2Listeners){
        el.handle(ev);
    }
}
private void alertListeners(EventType3 ev){
    for(EventType3Listener el : et3Listeners){
        el.handle(ev);
    }
}

have something more like: 有更多类似的东西:

private <T extends MyEventTypeSuperclass> void alertListeners(T ev)

Except I can't figure out how to actually code the for loop... Is it possible to do what I want, or will I have to write a bunch of nearly identical methods? 除非我无法弄清楚如何真正为for循环编写代码...是否有可能做我想做的事情,还是必须编写一堆几乎相同的方法?

Well, why not encapsulate the listener stuff into a dedicate class? 好吧,为什么不将侦听器内容封装到一个专用类中呢?

public class Observable<E> {
    private List<Listener<E>> listeners = new ArrayList<L>();

    public void subscribe(Listener<E> listener) {
        listeners.add(listener);
    }

    public void alert(E e) {
        for (Listener<E> l : listeners) {
            l.handle(e);
        }
    }
}

and in the type that offers the event: 并提供事件的类型:

public final Observable<String> messageChannel = new Observable<String>();

public final Observable<Integer> resultChannel = new Observable<Integer>();
private <L extends MyEventTypeListenerSuperclass, E extends MyEventTypeSuperclass> void alertListeners(E ev, List<L> listeners){
    for(L el : listeners){
        el.handle(ev);
    }
}

or something like that 或类似的东西

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM