関数A、関数B、関数Cがあります
Mainからこれらの関数の1つ(AまたはBまたはC)をランダムに呼び出そうとしています。
どうすればそれを行うことができますか?
関数をFunctionListという配列リストに入れることはできますか
次に、次のことを行いますか?
int x = (int)(Math.random() * Functionlist.size());
FunctionCall = FunctionList.get(x)
関数の数が少ない場合、最も簡単な方法はswitch
、、
switch((int)(Math.random()*NUM_FUNCTIONS) {
case 0:
functionA();
break;
case 1:
functionB();
break;
// ...
}
私は、関数オブジェクトを標準的な方法で模倣します。これFunction<T>
は、メソッドを使用してインターフェイスを実装する-おそらく匿名の-クラスを作成するか、引数がない場合はcall(T arg)
さらに作成します。Runnable
それらのインスタンスはコレクションに入れることができます
Javaは関数ポインタをサポートしていません。回避策の1つは、関数に系統的に名前を付けることです。つまり、f1、f2、f3などです。次に、そのパターンに基づいてメソッドオブジェクトを作成します。たとえば、関数名f1、f2、f3を使用すると、次のように実行できます。
java.lang.reflect.Method method;
try {
methodName = "f" + String.valueOf((int) Math.random()*NUM_FUNCTIONS);
method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) {
// ...
} catch (NoSuchMethodException e) {
// ...
}
次に、次のように関数を呼び出します。
try {
method.invoke(obj, arg1, arg2,...);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
*この回答はここから多用されています。