私はGWTから始めて、イベント バスの概念を学習しています。この解決策は非常に複雑だと思います。そこで、すべての問題を確認するために自分でプロトタイプを作成して単純化しようとしました。
最初に、イベントバスに関する私の理解について書きます (完全に間違っている可能性があります)。このようなイベントを開催しています
public class FooEvent extends GwtEvent<FooHandler> {
public static Type<FooHandler> TYPE = new Type<FooHandler>(); //as event type integer ID
//for.. hm.. probably some inner use in Event Bus
@Override public Type<FooHandler> getAssociatedType() {
return TYPE;
}
//for handling
@Override protected void dispatch(FooHandler handler) {
handler.someMethod(this);
}
}
ハンドラー インターフェイス、
public interface FooHandler extends EventHandler {
void someMethod(FooEvent event);
}
利用方法
eventBus.addHandler(FooEvent.TYPE, new FooHandler() {
@Override
public void someMethod(FooEvent event) {
//bla-bla
}
});
eventBus.fireEvent(new FooEvent());
それでおしまい。そして今、私のプロトタイプ。
//replaced GwtEvent
interface UniGwtEvent {
}
//than, event pretty simple
public class FooEvent extends UniGwtEvent {
}
//replaced GwtEventHandler. You should not create special handler class per event!
public interface UniEventHandler<T extends UniGwtEvent> {
void handle(T event);
}
//event bus prototype(in pseudocode)
class UniEventBus {
//map. keys getted from class. as I understand, it's possible from GWT 1.5 see http://code.google.com/p/google-web-toolkit/issues/detail?id=370
public <T extends UniGwtEvent> void addListener(Class<T> event, UniEventHandler<T> handler){
map.put(event.getName(), handler);
}
public void fireEvent(UniGwtEvent event){
if(map.contains(event.getClass().getName())){
map.get(event).handle(event);
}
}
}
利用方法
eventBus.addListener(FooEvent.class, new UniEventHandler<FooEvent>(){
@Override
public void handle(FooEvent event) {
bla-bla
}
});
eventBus.fireEvent(new FooEvent());
Type
不要な操作を行ったり、イベントごとに Handler クラスを作成したりしないため、このソリューションの方がはるかに優れていると思います。欠点は 1 つだけです。ハンドラーの作成時にジェネリック型を指定する必要があります。しかし、この解決策を不可能にする他の多くの欠点や問題があると思います。彼らは何ですか?