我正在尝试创建一种简单的方法来为不同的域类触发CRUD类型的事件。我创建了以下事件类:
public class EntityModifiedEvent<E> extends Event<EntityModifiedEventHandler<E>> {
private E element;
private ModType modType;
private Class<E> clazz;
private static Map<String,GwtEvent.Type<EntityModifiedEventHandler<?>>> types = new HashMap<String, GwtEvent.Type<EntityModifiedEventHandler<?>>>();
public EntityModifiedEvent(ModType modType, E element, Class<E> clazz) {
this.element = element;
this.modType = modType;
this.clazz = clazz;
}
public Type<EntityModifiedEventHandler<?>> getType() {
return getType(clazz);
}
@SuppressWarnings({"rawtypes", "unchecked"})
public static GwtEvent.Type<EntityModifiedEventHandler<?>> getType(Class clazz) {
GwtEvent.Type type = types.get(clazz.toString());
if (type == null) {
type = new GwtEvent.Type<EntityModifiedEventHandler<?>>();
types.put(clazz.toString(), type);
}
return type;
}
public E getElement(){
return element;
}
public ModType getModType() {
return modType;
}
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public Type<EntityModifiedEventHandler<E>> getAssociatedType() {
return (Type) getType();
}
@Override
protected void dispatch(EntityModifiedEventHandler<E> handler) {
handler.onEntityModified(this);
};
public interface EntityModifiedEventHandler<E> extends EventHandler {
void onEntityModified(EntityModifiedEvent<E> entityModifiedEvent);
}
因此,任何类都可以将自己注册为监听器,如下所示:
getEventBus().addHandler(EntityModifiedEvent.getType(MyDomainClass.class), this);
事件将被解雇:
getEventBus().fireEventFromSource(new EntityModifiedEvent<MyDomainClass>(ModType.CREATE, instanceModified, MyDomainClass.class), this);
ModType只是一个简单的枚举,具有不同类型的修改。 我有一些担心在这个类本身中有一个包含所有class.toString-&gt; eventTypes的地图。 您认为这会带来性能问题吗? 此外,此方法依赖于EventBus,使用Type对象的哈希码来标识为该类型注册的处理程序(请参阅getType(Class clazz)函数)。 您认为依靠它是错误的吗?
关于如何做到这一点的任何其他建议?任何评论将不胜感激!
答案 0 :(得分:2)
你必须问问自己,你从这种方法中获得了什么?
使用特定事件进行的确切操作似乎是一个更好的选择:
我建议您查看gwteventbinder以修剪部分样板并改进代码。它还允许在一种方法中处理多个事件:
class SuperEvent extends GenericEvent { }
class EventOne extends SuperEvent { }
class EventTwo extends SuperEvent { }
class FormPresenter {
interface MyEventBinder extends EventBinder<FormPresenter> {}
private final MyEventBinder eventBinder = GWT.create(MyEventBinder.class);
FormPresenter(EventBus eventBus) {
eventBinder.bindEventHandlers(this, eventBus);
}
@EventHandler
void onEventOne(EventOne event) {
// handler for EventOne
}
@EventHandler(handles = {EventOne.class, EventTwo.class})
void onEventOneAndTwo(SuperEvent event) {
// handler for EventOne and EventTwo
}
@EventHandler(handles = {EventOne.class, EventTwo.class})
void onEventOneAndTwo2() {
// handler for EventOne and EventTwo without parameter
}
}