0

Javaでコールバックタイプの機能を実行する3つの異なる方法を知っていますが、それぞれの長所と短所を完全には理解していません。

Java APIには、次のような性質のメソッドが豊富に含まれています。

Button b = new Button();
b.setClickListener(<implements ClickListener>);

特定のAPIを参照するのではなく、一般的な例として「ボタン」を使用しています。

1.)これを使用する1つの方法は、クラスにインターフェースを実装させ、それを引数として渡すことです。複数の「ボタン」を処理するには、呼び出し元がコールバックに提供する情報を使用して区別する必要があります。

MyClass implements ClickListener
...
Button b = new Button();
b.setClickListener(this);
...
public void click(ButtonEvent e)
{
...

2.)別の方法は、その場で匿名のClickListenerを作成し、その「クリック」メソッドに実行するコードを含めることです。ローカルの最終変数を使用してコールバックに新しいパラメーターを追加できるため、これにはいくつかの追加の利点があります。

for(int i=0 ; i<10 ; i++)
{
  final int finali = i;
  buttons[i] = new Button();
  buttons[i].setClickListener(new ClickListener()
  {
    public void click()
    {
      buttonClick(finali);
    }
  });
}

3.)コールバックを呼び出すクラスを作成している場合は、最後の方法が可能です。キャッチしたいコールバックメソッドを匿名でオーバーライドすることができます。最も明らかな欠点は、オブジェクトの存続期間中にコールバックを切り替えることができないことです。

for(int i=0 ; i<10 ; i++)
{
  final int finali = i;
  buttons[i] = new Button()
  {
    public void click()
    {
      buttonClick(finali);
    }
  }
}

オプション3は、多くの点で最も「単純」なようです。さまざまなインターフェイスを作成する必要はなく、コールバック関数は常に初期化が行われる場所にあります。

だから私の質問は、これらのデザインの選択を検討するときにどのような要因が関係するのかということです。

4

2 に答える 2

2

最初の2つは同じものです。唯一の違いは、リスナーインターフェイスを誰が実装するかです。オブザーバブル/オブザーバーのデザインパターンを使用します。

最後のものは継承を使用し、柔軟性がはるかに低くなります。

  • ボタンを作成するときにクリックで実行する必要があることのみを設定できます
  • 後でこの動​​作を変更することはできません
  • クリックで実行するアクションは1つだけ登録できます
  • クリックでアクションを削除することはできません
  • クラスを非最終にする必要があり、クリックメソッドをオーバーライド可能にする必要があります
  • 同じリスナーを複数のボタンに追加することはできず、コードの重複につながります
  • ..。

最初のものは間違いなくより良いオプションです(そしてSwing、Android、JavaScriptイベントなどで使用されるソリューションです)。一般に、構成は継承よりも優先されるべきです。このケースは、このルールの完璧な例です。

于 2012-11-02T22:48:21.987 に答える
2

オプション1は便利なことがよくありますが、複数のオブジェクトをリッスンする場合は、どのオブジェクトがコールバックをトリガーしたかを明示的に確認する必要があるため、問題になります。

オプション2は、各リスナーが分離しているため、この問題を回避します。これは、3つのアプローチの中で最も柔軟性があります。

オプション3は、イベントをリッスンするのではなく、基本的にボタンを引き継ぐため、悪い考えです(つまり、これは実際にはコールバックではありません)。ボタンに関心のある他のコードに干渉する可能性があり、コードを拡張するのが難しくなります。ダークサイドに従わないでください;-)。

そして、多くの場合、コールバックを呼び出すクラスを作成することはありません...

于 2012-11-02T22:44:38.267 に答える