イベントの処理:インターフェイスを実装するか、内部クラスを使用してインターフェイスを処理します。 どちらが良いですか

Handle an event: implement an interface or using inner class to handle the interface. Which is better


質問 written by thuanle @2012-09-09 19:14:56Z

: 6 : 2 : 1

イベントを処理するには、2つの方法があります。

  1. たとえば、コールバックインターフェイスの実装

    public class A implements View.OnClickListener { public void onClick(View v) { .... } @Override protected void onCreate(Bundle savedInstanceState) { ... aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout); aboutLayout.setOnClickListener(this); } } 
  2. コールバックインターフェイスを実装する内部クラスの作成

     public class ActivityAbout { private class ViewClickListener implements View.OnClickListener { public void onClick(View v) { .. } } @Override protected void onCreate(Bundle savedInstanceState) { ... ViewClickListener listener = new ViewClickListener(); aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout); aboutLayout.setOnClickListener(listener); } } 

どちらの方がよいですか?

回答 1 written by Eric @2012-09-09 19:29:18Z
1

コードが非常に長い(および編成またはメソッド化する必要がある)場合、または同じコードを繰り返し使用する場合は、内部クラスを使用する傾向があります。 私のSurfaceコールバックでさえ、わかりやすくするために内部クラスとして編成されています。

コードが短くて扱いやすい場合(おそらくイベント内の1行だけ)、匿名クラスを使用します。

イベントがクラス自体に直接関連する場合にのみ最初の実装を使用し、他のリスナーを接続する必要はありません。 これは非常にまれな状況です。 (単純なデバッグにも使用していますが、ここでは関係ありません。)

回答 2 written by Sam @2012-09-09 19:30:29Z
4

選択はクラスの使用方法に完全に依存します。各メソッドは有効であり、対応する長所と短所があります。

  • 方法1は簡単にコーディングできますが、組織の混乱になる場合とそうでない場合がある1つのonClick()関数に制限されます。
  • 方法2では、複数のonClick()関数を作成し、それらをより論理的な方法で使用できます。

しかし、方法3、匿名のコールバックを提示したいと思います。

public class MyActivity extends Activity {
    OnClickListener myClickListener1 = new OnClickListener() {
        public void onClick(View v) {
            ..
        }
    }

    OnClickListener myClickListener2 = new OnClickListener() {...}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        view.setOnClickListener(myClickListener1);
    }
}

方法2とは異なり、カスタムクラスを作成しなかったことに注意してください。 機能を追加したり、ローカル変数を保持したり、OnClickListenerの基本機能を変更したりしない限り、新しいカスタムクラスを作成することは避けます。