在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()方法。 这种模式设计不佳吗?你能建议其他方法吗?
提前感谢您的帮助。
答案 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
不再存在时删除,请考虑尝试在终结器中断开连接。