2016-01-07 3 views
0

Каков наилучший способ избежать циклических зависимостей в этом очень упрощенном примере? Я хотел бы избежать вставки 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(); 
    } 
} 
+0

Вы можете увидеть пример, который я создал здесь: http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/DataFetche r.java FetcherListener - это статический интерфейс. Поскольку интерфейс является общедоступным, любой другой класс может реализовать это и зарегистрироваться для обновлений из DataFetcher. – ControlAltDel

ответ

0

Обычно вы делаете слушатель «внутренний» класс диалога, то он имеет неявный экземпляр диалога:

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

}

Смежные вопросы