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は、多くの点で最も「単純」なようです。さまざまなインターフェイスを作成する必要はなく、コールバック関数は常に初期化が行われる場所にあります。
だから私の質問は、これらのデザインの選択を検討するときにどのような要因が関係するのかということです。