使用监听器时避免循环依赖
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();
}
}