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

私の論理では、これへの出力は単一の「テスト」である必要があります。実際、これは 2 つの「テスト」であり、ハンドラは 2 回呼び出されます。これがなぜなのか、私にはよくわかりません。c1 は単一のオブジェクトなので、ハンドラーは一度だけ呼び出されるべきではありませんか?

4

1 に答える 1

1

の 2 つのインスタンスを作成しTestClass、 を介して後者を参照していc1ます。インスタンス化のたびに、匿名ハンドラーが 1 つのグローバル バスに追加されました。したがって、バスのコレクションには 2 つのハンドラがあり、発火するTestEventと 2 つの「テスト」が呼び出されます。

于 2013-07-11T02:28:09.423 に答える