Я начинаю с 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
манипуляций и создавать класс обработчиков для каждого события. Я вижу только один недостаток - вы должны указать универсальный тип при создании обработчика. Но я полагаю, что есть много других недостатков или проблем, которые делают это решение невозможным. Что они?