使用监听器时避免循环依赖

Avoiding cyclic dependencies when using listeners

在这个非常简单的示例中,避免循环依赖的最佳方法是什么?我想避免内联 SelectionChangedListener,因为它是 large/complex class.

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

通常你让监听器成为对话框的 'inner' class,然后它有一个对话框的隐式实例:

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

}