1

現在、私は次の問題に直面しています:私たちはプロジェクトでいくつかのサードパーティのライブラリを使用しており、特定のタイプのリスナーの追加と削除 (取得ではありません!) をサポートするモデルがあります。そして問題は、リスナーを追加してから、インスタンスがない別の場所にリスナーを削除することです。解決策の1つはsingleton、同じインスタンスを追加して削除できるようにすることでした(ただし、これは醜いです)。2つ目は以下でした。

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());

しかし、2番目のものには醜いequals()方法があります:(そして、そのようにリスナーを削除するのはちょっと難しいと言われました.

そこで、これら 2 つのバリエーションについてあなたの意見をお聞きしたいと思います。おそらく (それは素晴らしいことです)、私が見つけたよりもクールなものを提案していただけないでしょうか。

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 に答える