Java 使用侦听器时避免循环依赖

Java 使用侦听器时避免循环依赖,java,jface,Java,Jface,在这个非常简单的例子中,避免循环依赖的最佳方法是什么?我希望避免将SelectionChangedListener内联,因为它是一个相当大/复杂的类 class SomeGui extends Dialog { TreeViewer someWidget; SelectionChangedListener someListener; private void someMethod(){ someListener = new SelectionChange

在这个非常简单的例子中,避免循环依赖的最佳方法是什么?我希望避免将SelectionChangedListener内联,因为它是一个相当大/复杂的类

class SomeGui extends Dialog {
    TreeViewer someWidget;
    SelectionChangedListener someListener;

    private void someMethod(){
        someListener = new SelectionChangedListener(this);
        someWidget.addSelectionChangedListener(someListener);
    }

    public void doSomething(){
    }
}

class SelectionChangedListener implements ISelectionChangedListener{
    SomeGui reference;

    public SelectionChangedListener(SomeGui reference) {
        this.reference = reference;
    }

    @Override
    public void selectionChanged(SelectionChangedEvent event) {
        reference.doSomething();
    }
}

通常,您将侦听器设置为对话框的“内部”类,然后它具有对话框的隐式实例:

class SomeGui extends Dialog {
    TreeViewer someWidget;
    ISelectionChangedListener someListener;

    private void someMethod() {
        someListener = new SelectionChangedListener();
        someWidget.addSelectionChangedListener(someListener);
    }

    void doSomething() {
    }

    private class SelectionChangedListener implements ISelectionChangedListener {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
           doSomething();
        }
    }
}
注意:如果您使用的是Java 8,则可以简化为:

class SomeGui extends Dialog {
    TreeViewer someWidget;
    ISelectionChangedListener someListener;

    private void someMethod() {
        someListener = this::widgetSelectionChanged;
        someWidget.addSelectionChangedListener(someListener);
    }

    private void doSomething() {
    }

    private void widgetSelectionChanged(SelectionChangedEvent event) {
       doSomething();
    }

}

您可以看到我在这里创建的一个示例:FetcherListener是一个静态接口。因为该接口是公共的,所以任何其他类都可以实现该接口并从DataFetcher注册更新。