删除特定的侦听器

时间:2012-12-19 08:38:54

标签: java listener software-design

目前我遇到了以下问题:我们在项目中使用了一些第三方库,并且有一个模型支持添加和删除(不获取!)某些类型的侦听器。问题是添加侦听器然后将其删除到其他地方,我们没有它的实例。其中一个解决方案是:使其成为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()方法:(而且我被告知,以这种方式移除听众有点棘手。

所以我想问一下你对这两个变种的看法,也许(那太棒了)你可以建议一些比我找到的更酷的东西。

1 个答案:

答案 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()中,您可以获得侦听器,该侦听器是从地图添加的,并将其删除。