8

匿名クラスと名前付き内部クラスを使用する際の良い習慣は何ですか?

多くの UI 要素 (ボタン、テキスト フィールドなど) を含む Android アプリケーションを作成しています。それらの多くには、ある種のリスナーが必要なのでonCreate、アプリケーションには、次のような非常に小さな匿名クラスがたくさんあります。

someButton.setOnClickListener(
    new View.OnClickListener() {
        public void onClick(View v) {
            // do something...
        }
    }
);

このような匿名クラスはそれぞれ 5 行から 20 行の大きさで、十分に小さく、 Java™からの推奨事項に適しています。

一般に、次の場合は、ローカル クラスの代わりに匿名クラスの使用を検討する必要があります。

  • クラスの本体は非常に短いです。
  • クラスのインスタンスは 1 つだけ必要です。
  • クラスは、定義された直後に使用されます。
  • クラスの名前によってコードが理解しやすくなるわけではありません。

しかし、IMO の問題は、それonCreateが非常に大きくなり、コードを読んで理解するのがより複雑になることです。理解するのは簡単ですが、単に大きすぎます。

そのような場合、より良い方法は何ですか - それぞれがうまく分離されている小さな内部サブクラスがたくさんありますが、一度だけ使用するか、代わりに匿名クラスを使用し続ける方がよいでしょうか?

4

6 に答える 6

8

いずれにせよ明確な答えはないと思います。どちらのスタイルもうまく機能します。

別のオプションは、

1 回の関数呼び出しで各 onClick の内容を取得します。これにより、匿名クラスが非常に短くなります。すなわち:

someButton.setOnClickListener(
    new View.OnClickListener() {
        public void onClick(View v) {
            doSomeButtonClick();
        }
    }
);


private void doSomeButtonClick() {
  // do something
}
于 2010-08-26T16:11:32.940 に答える
5

onCreate()共通の機能によってグループ化された個別のメソッドにリファクタリングして、論理ユニットを作成します。GUI が複雑な場合は、後で役立ちます。

編集:

また、デフォルトでは、匿名クラス内ではコード フォーマッタによってさらにインデントされるため、フォーマッタによって複数の行に分割されて長くなるのを避けるために、行を短くする必要があります。これは通常、クラスを抽出して名前を付けるのに適した時期であることを明確にするものです。

于 2010-08-26T16:10:31.420 に答える
3

デスクトップ/スイングアプリケーションをやっていますが、コンセプトは同じだと思います。

私はすべてのイベントを1つのクラスで処理することを好むので、Controllerクラスを作成し、その1つのクラスに必要なすべてのリスナーを実装します。次に、リスナーのタイプごとにパネル上にメソッドを作成します。リスニングする必要のあるパネル内の各コンポーネントにリスナーを追加します。パネルを最初の引数としてControllerクラスのコンストラクターに渡し、パネル上のリスナー追加メソッドのそれぞれを呼び出させます。次に、パネルをインスタンス化するときにコントローラーをインスタンス化します。

これにはいくつかの利点があります。

  • すべてのイベント処理コードは1つのクラスにあります。
  • イベント間の機能のクロスオーバーは、簡単にキャッチして処理できます。
  • 影響を受けるすべての状態は、1つのクラスに保存および制御できます。
  • すべてのイベント処理コードは、コンポーネントレイアウトコードとは別のものです。
  • ビューレイヤー(パネル)は、コントローラーレイヤーについて何も知りません。

そうは言っても、接続しているイベントがすべて単純なことを行い、これらが他のイベントと競合しない場合は、匿名クラスを使用することは間違いではありません。

于 2010-08-26T16:14:29.707 に答える
1

コミュニティでベスト プラクティスと見なされているかどうかはわかりませんが、この種のクラスが大きくなりすぎると、パッケージ リスナーを作成し、その中にクラスを作成します。コードの後半で邪魔になる場合は、内部クラスまたは匿名クラスを使用する理由。

しかし、ほとんどの場合、この種のクラスが大きくなると、委任が不十分であることが原因です。おそらく、他のクラスには、リスナーを軽量化するのに役立つメソッドが必要です。

于 2010-08-26T16:11:40.807 に答える
0

これらのアイテムを名前付きクラスに配置することには、いくつかの利点があります。

1つ目は、あなたが言及したものです。これにより、onCreate()メソッドがより簡潔で理解しやすくなります。

2つ目は、名前がどのロジックがどのボタンに対応するかをすばやく識別し、コードをクリアする必要があることです。

3つ目は、職務の分離が容易なことです。IoCモデルに移行することにした場合は、リスナーの名前付き実装を注入するのがはるかに簡単になります。

于 2010-08-26T16:21:51.097 に答える
0

引用が示唆するように、これは主観的なものです。コードサイズが匿名クラスとして意味のあるものからそれ自体であることが意味のあるものへと一線を越えるのはどの時点であるかを判断するために、何が「非常に短い」および「理解しやすい」と見なされるかを自分で把握する必要があります。単位。

これについて誰かがあなたに与える答えは、「短い」とは何か、「短い」でなくなるには何行のコードが必要かという主観的な尺度に基づいています。

于 2010-08-26T16:10:01.870 に答える