1

私が教えられた、そしてそれゆえに制限されているのは、オブジェクトをハンドラーとして渡すことです。私はJavaとObjective-Cプログラミングプロジェクトの両方でこのアプローチを使用しましたが、機能します。

しかし、オブジェクトではなく、クラスをハンドラーとして登録するフレームワークに出くわしました。フレームワークがオープンソースであり、それがどのように機能するかを確認できることを望みますが、そうではありません:/。

注意してください!クラスを登録した後、イベントを処理するための非静的メソッドを実装します。それらが静的である場合、これがどのように機能するかは明らかであり、私はこのアプローチを本当に嫌います。

だから、これらは私の質問です:

  • クラスハンドラーはどのように機能し、通常のオブジェクトハンドラーとは異なりますか?
  • いつ、どちらをお勧めしますか?
  • このパターンには名前がありますか?


オブジェクトハンドラーの意味:

Java:

button.addActionListener(handlerObject);

クラスハンドラーの意味:

Java:

object.addCrazyHandler(MyHandler.class);
4

1 に答える 1

3

Java (Objective-C については不明) では、Reflection APIを使用して、オブジェクトとそのクラスに対してイントロスペクションを実行できます。したがって、Object.getClass()メソッドとClassのすべてのメソッドです。クラスのすべてのコンストラクター、メソッド、フィールド、実装されたインターフェイス、およびスーパークラスを見つけることができるだけでなく、コンストラクター、メソッド、またはフィールドでそれらを呼び出すこともできます (ただし、直接呼び出しよりも遅くnewInstance()なりinvoke()ますget()) set()。たとえば (例外ハンドラーは省略)、Reflection を介して引数なしのコンストラクターを呼び出すには、次のようにします。

Object o = SomeClass.class.getConstructor().newInstance();

多くのフレームワークがこれを使用しています。たとえば、 TestNGJUnitなどのテスト フレームワークは、これを使用してテスト クラスをインスタンス化します。XML 構成を使用する場合、Springも同様です。

あなたの場合、フレームワークはハンドラーのライフサイクルを制御したいと考えていますが、インスタンスを提供すると制御できません。別のオプションとして、ファクトリのインスタンスを取得することもできますが、これでは制限が厳しすぎる可能性があります。これは、オブジェクト自体を簡単に作成できる場合、より多くの定型コードを作成することも意味します。

于 2012-09-02T12:02:48.810 に答える