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