1

ある種のコマンドパターンをJavaで実装したいと思います。のような構造にしたい Map<String commandkey, Function()>。だから私はオブジェクト(Map、、、または任意の連想...)HashMapを持っていますLinkedHashMap。ここで、キーは文字列コマンドであり、値はキーによって呼び出したい関数です。これらの関数は、異なる戻り値、パラメーターの数、名前(異なるシグニチャー)を持つことができるという意味で異種である必要があります。C ++では、たとえば、boost::functionを介して関数ポインターまたはファンクターのマップを作成できます。したがって、Javaでそのようなイディオム(または広義にはパターン)を実装するすべての方法に名前を付けることができます。私は2つの方法を知っています:

  1. 反射(マイナス:遅くて非常に醜い)
  2. インターフェイスと匿名クラスの使用(マイナス:関数は同じ署名を持っている必要があります)

詳細な説明や記事へのリンクなどがとても参考になります。

4

1 に答える 1

5
  1. Javaには関数ポインタはなく、インターフェイスのみがあります
  2. imoの反射は、多くの人が考えるほど遅くて醜いものではありません
  3. 関数を呼び出す方法を知る必要があります(C ++でもそれを知る必要があります)ので、同じ署名を持つことはそれほど悪くはありません。次のような非常に柔軟な署名を取るだけです。 void command(Object... args)

編集:リフレクションパフォーマンスについて:このスレッドを見てください答え:Javaリフレクションパフォーマンス

リフレクションオブジェクトを呼び出すだけではそれほど遅くないことがわかります。名前によるルックアップには多くの時間がかかります。あなたの場合、関数ごとに2回以上それを必要としないと思います。

于 2013-03-01T14:13:22.880 に答える