1

目前我遇到了以下问题:我们在项目中使用了一些第三方库,并且有一个模型支持添加和删除(不获取!)某些类型的侦听器。问题是添加侦听器然后将其删除到其他地方,我们没有它的实例。解决方案之一是:制作它singleton以便您可以添加它并删除相同的实例(但这很难看,恕我直言)。第二个如下:

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()方法:(我被告知以这种方式删除听众有点棘手。

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

4

1 回答 1

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

于 2012-12-19T08:53:44.983 回答