java - 创建通用 GWT 事件 : is this a good approach?

标签 java javascript events generics gwt

我正在尝试创建一种简单的方法来为不同的域类触发 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->eventTypes 的映射有一些担忧。 您认为这会带来性能问题吗? 此外,此方法依赖于 EventBus,使用 Type 对象的哈希码来识别为该类型注册的处理程序(请参阅 getType(Class clazz) 函数)。 你认为依赖它是错误的吗?

关于如何执行此操作还有其他建议吗?任何评论将不胜感激!

最佳答案

你必须问自己从这种方法中你能得到什么?

  • 性能 - 没有。我没有这方面的可靠数据(我必须能够分析您的应用程序),但似乎这并没有提供可测量的性能提升(如果有的话)。触发事件的数量将相同,但接收器的数量将比更细粒度的方法更多。另外,还有类型检查。
  • 在触发任何实体修改事件时执行一些通用代码的能力,无论其类型如何。这是事实,但请继续阅读如何通过特定事件实现它。

使用特定事件来执行确切的操作似乎是更好的选择:

  • 它清楚地表明谁监听什么事件。
  • 事件可以包含特定于该事件的额外元数据(删除了多少记录、是否需要刷新缓存等)

我建议查看gwteventbinder trim 一些样板并改进您的代码。它还允许用一种方法处理多个事件:

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
  }
}

关于java - 创建通用 GWT 事件 : is this a good approach?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29956526/

相关文章:

java - Spring 覆盖 bean 配置设置其 "Primary"一个

java - 这个错误有什么解决办法吗?

javascript - 为什么我的 javascript 文件无法加载?

.net - 控件引发的事件应该在 UI 线程上吗?

jquery - 如何让点击事件只在父 DIV 上触发,而不是在子 DIV 上触发?

java - Java中的多个OR条件

java - 使用静态初始化 block 来提高性能

javascript - 使用 BeautifulSoup 进行网页抓取不起作用

javascript - 获取项目的顺序 jquery sortable 并为它们设置顺序

java并发: flag/event