gpt4 book ai didi

java - Activity 巴士回顾

转载 作者:行者123 更新时间:2023-12-02 00:38:42 24 4
gpt4 key购买 nike

我现在开始学习GWT并学习事件总线概念。我发现这个解决方案非常复杂。所以我尝试通过自己编写原型(prototype)来简化它以查看所有问题。

首先我会写一下我对事件总线的理解(这可能是完全错误的)。我们有这样的 Activity

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

处理程序接口(interface),

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());

就是这样。现在是我的原型(prototype)。

//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 操作并为每个事件创建处理程序类。我只看到一个缺点 - 您应该在创建处理程序时指定通用类型。但我认为还有许多其他缺点或问题使该解决方案变得不可能。它们是什么?

最佳答案

使用您的实现没有明显的优势。当我读到它时,你的和 GWT 之间有两个区别 EventBus :

  1. 使用 Strings而不是Type将事件处理程序绑定(bind)到事件类型的对象。这不是一个有意义的差异 - 在应用程序中拥有更多类型不会受到任何惩罚,并且我怀疑在运行时,Strings将使用比 Types 稍多的资源.

  2. 直接将事件分派(dispatch)给适当的处理程序,而不是委托(delegate)给事件类型。我更喜欢 GWT 的方法,因为它为事件的分派(dispatch)方式提供了灵 active 。例如,人们可能希望处理程序实现两种不同的方法,根据事件的上下文调用这两种方法。采取以下(简单)示例:

    public class ExampleEvent extends GwtEvent<ExampleEvent.Handler> {
    public interface Handler extends EventHandler {
    void onExample(Integer id);
    void onExample(String name);
    }

    private final Integer id;
    private final String name;

    public ExampleEvent(Integer id) {
    this.id = id;
    this.name = null;
    }

    public ExampleEvent(String name) {
    this.name = name;
    this.id = null;
    }

    public void dispatch(Handler handler) {
    if (name != null) {
    handler.onExample(name);
    } else {
    handler.onExample(id);
    }
    }
    }

    在这种情况下,将分派(dispatch)委托(delegate)给事件允许我们采取必须为每个处理程序执行的操作(确定事件是否包含 ID 还是名称),而不需要在每个单独的事件处理程序中执行测试。

我建议使用 GWT 的 EventBus实现 - 它有效并且经过测试。

关于java - Activity 巴士回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5193386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com