2015-11-13 30 views
2

在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,以这样做是在A中的数据的变化作出反应当一个新的B实例被构造时。
由于对象a存在于A之外,因此此方法迫使我创建一个dispose()方法,该方法将侦听器从对象a中移除。

虽然我知道精心设计的JAVA代码通常不需要dispose()方法。 这种模式是一种糟糕的设计吗?你能否提出其他方法?

在此先感谢您的帮助。

+0

这可能是相关的:http://stackoverflow.com/questions/171952/is-there-a-destructor-for-java –

回答

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不再存在,考虑尝试在终结断开被删除。

+0

你的答案更关注模式的优惠。如果你需要设置**'a',可以这样做构造函数。 –

+0

同意。完成同样的事情有很多种方式,但有些比其他更明确。 **在调用'dispose'之后,要求设置**'a'会产生问题。在这种情况下,重写'finalize'可能是正确的解决方案? –