我有三个类,A,B和C.A听B来改变,B听C。如果C改变了,它会调用它的监听器B上的notifyChange(),其监听方法看起来像这样:
clientComp.setChangeListener(new NavigationClientCompositeListener() {
@Override
public void notifyChange() {
notifyChange();
}
});
B只想将此通知传递给A,这就是我的问题。 notifyChange()方法内部的notifyChange()调用将导致无限循环。有没有办法引用notifyChange() - 这个接口实现中B类的方法?或者这只是一个糟糕的设计开始?
我怎样才能最好地解决这个问题?我当然可以更改B方法的名称,但是如果我有很多这样的嵌套类,那就会让它成为嘲讽,这不是我追求的解决方案。
答案 0 :(得分: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
}
});
答案 1 :(得分: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();
请注意这是用于说明原则的所有伪代码。我无法保证其编辑