2014-01-30 88 views
0

我有三個類,A,B和C.A監聽B的更改,B監聽C.如果C更改,它將調用notifyChange()on它的聽衆,B,其聽音方法是這樣的:使用具有相同名稱的notify-method的嵌套偵聽器

clientComp.setChangeListener(new NavigationClientCompositeListener() { 

     @Override 
     public void notifyChange() { 
      notifyChange(); 
     } 
    }); 

乙只是想傳遞至A該通知,而這就是我的問題。 notifyChange()方法內的notifyChange()調用將導致無限循環。有沒有辦法引用notifyChange() - 這個接口實現中的B類的方法?或者,這是否只是糟糕的設計?

我該如何最好地解決這個問題?我當然可以改變B的方法的名稱,但是如果我有很多這樣的嵌套類,這會使它變得詭異,而且這不是我之後的解決方案。

回答

2

使用<class-name>.this幫助您參考外部類

clientComp.setChangeListener(new NavigationClientCompositeListener() { 

    @Override 
    public void notifyChange() { 
     B.this.notifyChange(); //Calls the notifyChange() of B, which is the outer class 
    } 
}); 
+0

完美,謝謝! – Jake

0

在建立這種觀察者類型的行爲觀察員應與他們所觀察到寄存器的當前情況下,這可以通過接口來表示。

public interface Observable{ 
    public void registerObserver(Observer o); 
} 

public interface Observer{ 
    public void notify(); 
} 

然後在各自的類中實現這些接口。

class A implements Observer{ 
    public void notify(){ 
     //do something 
    } 
} 

class B implements Observer, Observable{ 
    List<Observer> observers = new ArrayList<Observer>(); 
    public void notify(){ 
     for(Observer o: observers){ 
      o.notify(); 
     } 
    } 

    public void registerObserver(Observer o){ 
     observers.add(o); 
    } 
} 

class C implements Observable{ 
    List<Observer> observers = new ArrayList<Observer>(); 

    public void registerObserver(Observer o){ 
     observers.add(o); 
    } 

    public void doSomething(){ 
     for(Observer o: observers){ 
      o.notify(); 
     } 
    } 
} 

然後在某些方法或主要方法一起註冊這些觀察員:

A a = new A(); 
B b = new B(); 
C c = new C(); 
b.registerObserver(a); 
c.registerObserver(b); 
c.doSomething(); 

請注意,這是所有的僞代碼來說明一個原則。我無法保證其編輯

相關問題