インタラクティブなJavaプログラム用の非常に単純なコマンドラインライブラリを作成しようとしています。Javaプログラムを起動すると、コマンドの入力を求められます。構文は次のとおりです。
> action [object_1, [object_2, [... object_n] ... ]]
例えば:
> addUser name "John Doe" age 42
ここaction = "addUser", object_1 = "name", object_2 = "John Doe", object_3 = "age", object_4 = "42"
に。
アクションの後はすべてオブジェクトです(つまり、アクションはオブジェクトを使用します)。アクションとオブジェクトが単純な文字列であることがわかります。必要に応じて、オブジェクト文字列を数値に変換することもできます。
私の計画では、このコマンドラインライブラリのユーザーは、(適切なJavaオブジェクトに属する)メソッドを作成し、各メソッドを特定のアクションに割り当てるだけです。コマンドラインのオブジェクトは、ユーザーが割り当てるメソッドのパラメーターになります。上記の例のメソッドを実装する適切なクラスは次のとおりです。
class Foo {
public void addUserHandler(
String param1, String param2, String param3, Integer param4) {
do.someThing();
}
}
ユーザーがコマンドを入力すると、プログラマーによって割り当てられた対応する関数が、コマンドラインで指定されたパラメーターを使用して呼び出されます。
Javaには関数ポインター(Cなど)やデリゲート(C#など)がなく、コールバックを実装する方法はインターフェイスを介することを知っていますが、このシナリオでインターフェイスを使用する方法がわかりません。私がインターフェースで見る問題は、それらが持っているということです:
- 実装する関数の数は固定されています
- 実装する関数の宣言は固定されています。
(1)の問題は、私のライブラリのユーザーが、サポートしたいアクションの数だけ、任意の数の関数を実装することを決定する可能性があることです。(2)の問題は、ユーザーが「addUSer」アクションのaddUserHandler()のように、わかりやすい名前で関数を割り当てたいということです。
Javaにデリゲートまたは関数ポインターがある場合は、文字列(アクションを表す)とデリゲート(プログラムでのアクションの実際の実装用)の間にマップを作成するだけです。Reflectionを使用してデリゲートをエミュレートできると思いますが、クラスとメソッドに文字列名を使用する必要があるため、これは面倒で型の安全性が失われます。より良い方法はありますか?
ありがとう、