クラス MethodDelegate

java.lang.ObjectSE
org.springframework.cglib.reflect.MethodDelegate

public abstract class MethodDelegate extends ObjectSE
DOCUMENTATION FROM APACHE AVALON DELEGATE CLASS

デリゲートは、別のメソッドへの型安全なポインターです。Java にはそのような構造に対する言語サポートがないため、このユーティリティは、メソッド呼び出しを同じシグネチャーを持つ任意のメソッドに転送するプロキシを構築します。このユーティリティは、C# デリゲートメカニズムに部分的に着想を得ています。Java 中心の方法で実装しました。

委譲

1 つのメソッドを持つ任意のインターフェースは、デリゲートのインターフェースになることができます。以下の例を考えてみましょう。

  public interface MainDelegate {
      int main(String[] args);
  }

上記のインターフェースは、デリゲートになるインターフェースの例です。メソッドは 1 つだけで、インターフェースは public です。そのメソッドのデリゲートを作成するには、MethodDelegate.create(this, "alternateMain", MainDelegate.class) を呼び出すだけです。次のプログラムは、その使用方法を示しています。

  public class Main {
      public static int main( String[] args ) {
          Main newMain = new Main();
          MainDelegate start = (MainDelegate)
              MethodDelegate.create(newMain, "alternateMain", MainDelegate.class);
          return start.main( args );
      }

      public int alternateMain( String[] args ) {
          for (int i = 0; i < args.length; i++) {
              System.out.println( args[i] );
          }
          return args.length;
      }
  }

デリゲート自体は、あまり機能しません。それらの真の力は、オブジェクトのように扱うことができ、他のメソッドに渡すことができるという事実にあります。実際、これは、人工知能の基盤となるインテリジェントエージェントを構築するための重要な構成要素の 1 つです。上記のプログラムでは、デリゲート作成呼び出しを MethodDelegate.createStatic(getClass(), "main", MainDelegate.class) に置き換えることで、静的 main メソッドに一致するデリゲートを簡単に作成できました。

デリゲートのもう 1 つの重要な用途は、イベントリスナーの登録です。イベントのすべてのコードを個々のクラスではなくメソッドに分割する方がはるかに簡単です。Java がこれを回避する方法の 1 つは、匿名クラスを作成することです。多くのデバッガーはそれらの処理方法がわからないため、これらは特に厄介です。匿名クラスも多くのコードを複製する傾向があります。1 つの宣言されたメソッドを持つ任意のインターフェースを使用して、署名に一致する任意のメソッドにイベントを転送できます (ただし、メソッド名は異なる場合があります)。

等価

2 つのデリゲートが等しいかどうかをテストするために使用する条件は次のとおりです。
  • どちらも同じインスタンスを参照します。つまり、newDelegate メソッドに渡された instance パラメーターは両方で同じです。インスタンスは、同一性等価演算子 == で比較されます。
  • これらは、Method.equals によって解決されたのと同じメソッドを参照しています。