使用具有相同名称的notify-method的嵌套侦听器

时间:2014-01-30 10:46:39

标签: java listener

我有三个类,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方法的名称,但是如果我有很多这样的嵌套类,那就会让它成为嘲讽,这不是我追求的解决方案。

2 个答案:

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

请注意这是用于说明原则的所有伪代码。我无法保证其编辑