2014-01-30 3 views
0

A, B 및 C의 세 클래스가 있습니다. A는 변경 사항을 B에서 수신하고 B는 C를 청취합니다. C가 변경되면 notifyChange()가 on 이 청취자는, 그 청취 방법 B는 다음과 같습니다이다 :같은 이름의 notify-method를 사용하는 중첩 된 리스너

clientComp.setChangeListener(new NavigationClientCompositeListener() { 

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

B는 A와에이 알림을 전달하는 원하고, 여기 내 문제가있다. notifyChange() 메소드 내부의 notifyChange() 호출은 무한 루프를 발생시킵니다. notifyChange() -이 인터페이스 구현 내에서 B 클래스의 메서드를 참조하는 방법이 있습니까? 또는이 처음부터 나쁜 디자인입니까?

어떻게하면이 문제를 가장 잘 해결할 수 있습니까? 나는 물론 B의 메소드의 이름을 바꿀 수 있지만, 이렇게 많은 중첩 된 클래스가 있다면 그것은 ridicoulus가 될 것입니다. <class-name>.this를 사용

답변

2

당신이 외부 클래스

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

이이 원리를 설명하기 위해 모든 사이비 코드주의하시기 바랍니다. 나는 그 컴파일을 보장 할 수 없다.

관련 문제