Java 第一次事件通知时GWT removeHandler

Java 第一次事件通知时GWT removeHandler,java,events,gwt,event-handling,Java,Events,Gwt,Event Handling,我想在第一次收到事件时删除GWT事件处理程序。我还想避免跟踪不必要的注册对象而污染我的类。我目前将其编码为: final HandlerRegistration[] registrationRef = new HandlerRegistration[1]; registrationRef[0] = dialog.addFooHandler(new FooHandler() { public void onFoo(FooEvent event) { HandlerR

我想在第一次收到事件时删除GWT事件处理程序。我还想避免跟踪不必要的注册对象而污染我的类。我目前将其编码为:

final HandlerRegistration[] registrationRef = new HandlerRegistration[1]; registrationRef[0] = dialog.addFooHandler(new FooHandler() { public void onFoo(FooEvent event) { HandlerRegistration removeMe = registrationRef[0]; if(removeMe != null) { removeMe.removeHandler(); } // do stuff here } }); 最终HandlerRegistration[]registrationRef=新HandlerRegistration[1]; registrationRef[0]=dialog.addFooHandler(新的FooHandler() { 公开作废onFoo(FooEvent事件) { HandlerRegistration removeMe=registrationRef[0]; if(removeMe!=null) { removeMe.removeHandler(); } //在这里做事 } });
但是使用registrationRef会降低代码的可读性。有没有更好的方法可以在不向类中添加变量的情况下执行此操作?

我只需将
HandlerRegistration
对象作为封闭类的字段,这样您就不会被编译器打扰,而且它比无序排列数组和其他东西更“优雅”:

public class TestWidget extends Composite {
    //...

    HandlerRegistration handler;

    public TestWidget() {
        // ...

        handler = button.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                // ...
                handler.removeHandler();                
            }
        });
    }

}

是的,谢谢。我想,当一个类中只有一个侦听器时,就应该这样做(但是,当您以这种方式处理任意数量的小部件时,事情会变得更加混乱)。我希望有一种方法可以在不增加新领域的情况下做到这一点。哦,好吧……这可能不像看上去那么直截了当。我有一个例子,在onXXX()方法中将处理程序设置为null。为什么?因为没有什么可以阻止GWT直接调用处理程序。例如,在Image.onLoad()中的IE示例中,如果图像已经加载,则它可以在addLoadHandler()调用期间实际调用处理程序。我发现在这种情况下,唯一的修复方法是在“if null”检查中进行包装,然后在以后进行清理。如果可以多次添加处理程序,则这不起作用。