Java侦听器删除

时间:2015-11-13 12:04:36

标签: java oop

在JAVA中,我经常使用这种模式:

class A{
    void addListener(Listener obj);  
    void removeListener(Listener obj);
}

class B {
    private A a;

    B(A a){
        this.a=a;
        a.addListener(myListener)
    }

    private final myListener=new Listener(){
        void listener(); 
    }

    public void dispose(){
        a.removeListener();
    }
}

通常A表示数据集,B需要响应A中数据的更改。这是通过在构造新B实例时向对象a添加侦听器来完成的。
由于对象a存在于A外部,因此这种方法迫使我创建一个dispose()方法,该方法从对象a中删除侦听器。

虽然我知道设计良好的JAVA代码通常不需要dispose()方法。 这种模式设计不佳吗?你能建议其他方法吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

通常我会避免需要A作为参数的构造函数。具有无参数构造函数的模式更易于阅读,允许序列化,允许更灵活地重用对象等。

同样在您的代码中,有一段时间,在调用dispose后,您有一个'已断开连接'B。如果在这段时间内调用方法,则必须处理错误条件。

所以,为了让它更加万无一失:

class B {
  private A a=null;

  B(){}

  public connectToA(A a){
    if(a!=null) throw new RuntimeException(...);
    this.a=a;
    a.addListener(myListener)
  }

  private final myListener=new Listener(){
    void listener(); 
  }

  public void disconnectFromA(){
    if(a==null) throw new RuntimeException(...)
    a.removeListener();
  }
}

如果您确实希望在B存在时存在连接,并且在B不再存在时删除,请考虑尝试在终结器中断开连接。