java - 删除特定监听器

标签 java listener software-design

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

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

所以我想询问您对这两个变体的看法,也许(这太棒了)您可以提出比我发现的更酷的东西。

最佳答案

您可以引入某种单例管理器,而不是使用单例监听器,如下所示:

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

关于java - 删除特定监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13948389/

相关文章:

java - 如何阻止应用程序退出后出现插页式广告?

java - 包裹 android.os.Parcel@72a6e36 : Unmarshalling unknown type code 2131365270 at offset 500

java - Swing:如何忽略取消选择事件?

matlab - 如何将监听器设置为 MATLAB 对象的结构字段

oop - 内聚力和耦合之间的区别

java - 将复合主键添加到sql结果中

java - 调用 EntityManager.persist() 时出现未知实体

python - 使用 Python 进行 HTTP 请求和响应检查

java - 如何围绕面向对象设计进行思考

c# - 从 SQL Server 调用 REST API