3

私がJavaに深く関わってから数年になります。戻ってみると、このパターンがいたるところに見られます。

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
  public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
    // do work
  }
});

これは私には関数型プログラミングのように見えます。いいパターンですが、どうすればこのようなメソッドを渡すことができますか?昔はクラスはクラスでしたが、一度コンパイルすると、それに対してできることはほとんどありませんでした。

私の質問は次のとおりです。

  1. このパターンの名前を教えてもらえますか?
  2. この方法でインスタンス化できるクラスを作成するにはどうすればよいですか。
  3. Javaに取り入れられた機能パターンの他の有用な例はありますか?
  4. これについてもっと読むには、Googleに何が必要ですか?

ありがとう。

4

4 に答える 4

9

これは、メソッドではなく、匿名クラスを渡します。

これは、Swingプログラミングだけでなく、本格的なものを作成する代わりに、再利用する必要のないインターフェイスまたはクラスの(うまくいけば)短い「使い捨て」実装が必要な場所での典型的なパターンです。実装。

どのクラス/インターフェースもこのようにインスタンス化できます。特別なことは何もありません。

public interface Foo {
    String foo();
}

..。

public class Main {
    public static void main(String[] args) {
        System.out.println(new Foo() {
            public String foo() {
                return "plugh";
            }
        });
    }
}

匿名の内部クラスは、ソースが埋め込まれている場合でも、独自のクラスファイルを取得します。

この例ではMain$1.class、予期されたファイルに加えて、匿名内部クラスのファイルが生成されMain.classます。

于 2012-06-12T10:28:05.933 に答える
1

ステートメント:new OnRatingBarChangeListener()クラスの新しいインスタンスを作成します。中括弧内の次の部分は、クラスの定義です。

この場合、名前付きインターフェースを実装する匿名クラスのそのクラス。

匿名クラスは、名前なしで宣言されるクラスであるため、通常の名前付きクラスのように使用することはできません。

このパターンは、リスナーを使用する場合に非常に一般的です。リスナーには、ほとんど些細なタスクを実行する1つからいくつかのメソッドしか含まれていないことがよくあります。

于 2012-06-12T10:31:43.607 に答える
0

これはリスナーパターンです。評価バーは、適切なイベントの実装を取得し、そのメソッドOnRatingBarChangeListenerを呼び出します。onRatingChanged

を実装する任意のクラスのインスタンスを使用できますOnRatingBarChangeListener。したがって、独自の名前付きクラスを使用することも、例のように匿名クラスを渡すこともできます。この例の匿名クラスは、事実上、Objectを拡張し、OnRatingBarChangeListenerを実装する名前のないクラスです。クラスには名前が付けられていないため、参照できません。したがって、渡されたインスタンスが存在する唯一のインスタンスです。

于 2012-06-12T10:33:05.247 に答える
0

これを「オブザーバーパターン」と呼びます。この良い例は、Javaボタンまたは他のコンポーネントのアクションリスナーを追加することです。例えば、

myButton.addActionListener(
                new java.awt.event.ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    //Work here
                }
            });

ここでは、「myButton」がサブジェクトであり、ActionListenerがオブザーバーです。

于 2012-06-12T10:38:49.320 に答える