3

次の例を見てください。使用したいオブジェクトがあります。それを と呼びますDoodadDoodad要素は、ブラウザー イベントの処理を適切に実装していません。の典型的なインスタンス化DoodadDoodad someDoodad = new Doodad();. 明らかに、これはイベント処理が不十分なため、私のニーズには合いません。onBrowserEvent()次のように、メソッドをオーバーライドするのが適切ですか。

Doodad someDoodad = new Doodad() {
@Override
  public void onBrowserEvent(Event event) {
      switch (DOM.eventGetType(event)) {
          case Event.ONDBLCLICK:
          case Event.ONFOCUS:
          case Event.ONCLICK:
              if (!isEnabled()) {
                  return;
              }
              break;
      }
      super.onBrowserEvent(event);
  }
};

明らかにこれは単純な例ですが、匿名の内部クラスを使用したくない場合はどのような場合でしょうか? 明示的に許可されていない、または不可能なことはありますか?

最初の質問に対する回答はたくさんありますが、これまでのところ、2 番目の質問に対する回答はありません。

4

7 に答える 7

6

通常、匿名内部クラスの最適な使用法は、このクラスの特定の実装のインスタンスを1つだけ作成する場合です。そして、実装が非常に単純な場合。理想的には、1〜2行のコードが含まれている必要があります。

あなたの場合、あなたの方法onBrowserEvent()は2行より長いですが、それでも問題ありません。

于 2011-12-12T14:08:51.027 に答える
3

匿名内部クラスは、クロージャーを作成するための Java の構文です。おおよその例を次に示します。

interface Adder {
  int add(int arg);
}

...

Adder createAdder(int n) {
   final int nf = n;
   return new Adder() { 
       int add(int arg) { return arg + nf; } 
   }
}

メソッド createAdder は、クロージャーを使用して渡された値 n をキャプチャすることで、本質的に関数を作成します。クロージャーは、主流になろうとしている関数型プログラミングにおいて重要です。これが、Java で「本当の」クロージャーが必要だと誰もが叫んでいる理由です (つまり、私の例よりもほとんどが優れた構文です)。

(もちろん、私は尋ねられた質問に答えているわけではありません。私が言っているのは、匿名クラスは私が上で説明したものに適しているということだと思います。他のほとんどすべての場合、名前が自己文書化されているため、名前付き内部クラスを作成します私の意見では読みやすいです)

于 2011-12-12T14:16:29.857 に答える
1

多くの場合、イベント リスナーはあまり一般的ではないコードですが、特定のウィジェット、ボタン、テキスト フィールドなどに関連付けられています。このような場合、コードを再利用するために、コードを適切に公開する必要はありません。使用される場所で定義する方が簡単であり、それが匿名の内部クラスの目的です。クラス名、パッケージ、可視性、または再利用性について心配することなく、コードの一部を別のメソッド内にすばやく埋め込むことができます。

もちろん、匿名の内部クラスでできることは、常に適切なスタンドアロン クラスで行うことができます。しかし、イベント処理クラスが十分に汎用的 (多くのイベントを処理できる) で、再利用可能で、ステートフルである場合、またはより一般的に、イベント管理コードをコードから抽出することで何らかの利点がある場合は、このようにする方が理にかなっています。イベント生成要素を定義します。

あなたの質問を具体的に理解しているかどうかはわかりません。この情報があなたの答えを見つけるのに役立つことを願っています. さらに質問することを躊躇しないでください。

于 2011-12-12T14:13:49.947 に答える
1

1 つのメソッドを実装している場合、および/または画面の半分がいっぱいの場合は、匿名クラスをお勧めします。

匿名に自明でないコードがある場合、名前付きクラス IMHO を持つ価値があります。

于 2011-12-12T14:27:36.527 に答える
0

非常に少量のコードが含まれている場合にのみ、匿名の内部クラスを使用します。理由はIMOであり、コードが乱雑になり、読みにくくなります。

さらにコードが必要な場合は、基本クラス(この場合は「Doodad()」)を拡張して、新しいクラスを作成することをお勧めします。

于 2011-12-12T14:33:53.990 に答える
0

私の見解:

匿名内部クラス: 1 つの関数からのコールバック (コードを 2 回記述しないため)

名前付き内部クラス: 複数の関数 (または親クラスの内部ロジックにのみ必要なクラス) からのコールバック

于 2011-12-12T14:10:05.820 に答える