0

我在一个大程序中遇到了这个问题,所以我写了一个小样本来测试它。我希望有人可以向我解释这一点。

这是代码:

EventBus bus = new SimpleEventBus();

class TestClass {
    TestClass() {
        bus.addHandler(TestEvent.TYPE, new TestHandler() {

            @Override
            public void onEvent(TestEvent event) {
                System.out.println("test");
            }

        });
    }
}

class TestEvent extends GwtEvent<TestHandler> {
    public static final GwtEvent.Type<TestHandler> TYPE = new GwtEvent.Type<TestHandler>();

    @Override
    public Type<TestHandler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(TestHandler handler) {
        handler.onEvent(this);
    }
}

interface TestHandler extends EventHandler {
    void onEvent(TestEvent event);
}

之后我执行以下操作:

TestClass c1 = new TestClass();
c1 = new TestClass();
bus.fireEvent(new TestEvent());

现在按照我的逻辑,这个输出应该是一个单一的“测试”;事实上,它是两个“测试”,处理程序被调用了两次。我真的不明白为什么会这样;c1 是单个对象,所以不应该只调用一次处理程序吗?

4

1 回答 1

1

您创建了两个实例TestClass,通过引用后者c1。在每次实例化期间,都会将一个匿名处理程序添加到您的单个全局总线中。因此,总线在其集合中有两个处理程序,并在您触发时调用TestEvent,因此有两个“测试”。

于 2013-07-11T02:28:09.423 回答