目前我遇到了以下问题:我们在项目中使用了一些第三方库,并且有一个模型支持添加和删除(不获取!)某些类型的侦听器。问题是添加侦听器然后将其删除到其他地方,我们没有它的实例。其中一个解决方案是:使其成为singleton
,以便您可以添加它并删除相同的实例(但这很丑陋,imho)。第二个是以下内容:
class MyListener implements CoolThirdPartyModelListener{
...
@Override
public boolean equals(Object obj){
if (obj == null){
return false;
}
if(obj == this){
return true;
}
return obj instanceof MyListener;
}
}
只需调用:
即可将其从侦听器列表中删除coolThirdPartyModelInstance.removeListener(new MyListener());
但第二个方法有丑陋的equals()
方法:(而且我被告知,以这种方式移除听众有点棘手。
所以我想问一下你对这两个变种的看法,也许(那太棒了)你可以建议一些比我找到的更酷的东西。
答案 0 :(得分:0)
不是使用单例监听器,而是可以引入某种单例管理器,如下所示:
interface CoolThirdPartyListenerManager {
public void addListenerForModel(CoolThirdPartyModel model, CoolThirdPartyModelListener listener);
/*
* return value should indicate success of operation, i.g. return false if no
* listeners were added to model.
* it can also throw some sort of exception, if it suits your needs better.
*/
public boolean removeListenerFromModel(CoolThirdPartyModel model);
}
(或者你可以用一堆静态方法创建一个类)
内部实施可以有类似
的内容private Map<CoolThirdPartyModel, CoolThirdPartyModelListener> mAddedListeners;
将存储侦听器的实例,这些侦听器是为特定模型添加的。
然后在removeListenerFromModel()
中,您可以获得侦听器,该侦听器是从地图添加的,并将其删除。