最初に選択したパラメーターに応じてパラメーターの動的リストを持つコマンド ライン アプリケーションを Java で構築しています。
java -jar cli.jar --optimizer DifferentialEvolution [optimizer options]
このアプリケーションのオプティマイザーは、インターフェースを実装することによって定義されますInterfaceOptimizer
。リフレクションライブラリを使用して、このインターフェイスのすべてのサブタイプを検索し、コマンド ラインで指定された名前と一致するものを選択します。
オプティマイザーの各実装には、注釈でマークされたさまざまなパラメーターがあります@Parameter(name = 'cli-name', description = "Some option")
。パラメーターは、扱いやすい単純なタイプまたは複雑なタイプにすることができます。すべての複雑な型に対して、オプティマイザに対して行うのと同じサブタイプのルックアップを実行する必要があります。
public static Map<String, Class<? extends InterfaceOptimizer>> createOptimizerList() {
Map<String, Class<? extends InterfaceOptimizer>> optimizerList = new TreeMap<String, Class<? extends InterfaceOptimizer>>();
Reflections reflections = new Reflections("eva2.optimization.strategies");
Set<Class<? extends InterfaceOptimizer>> optimizers = reflections.getSubTypesOf(InterfaceOptimizer.class);
for(Class<? extends InterfaceOptimizer> optimizer : optimizers) {
// We only want instantiable classes
if(optimizer.isInterface() || Modifier.isAbstract(optimizer.getModifiers())) {
continue;
}
optimizerList.put(optimizer.getSimpleName(), optimizer);
}
return optimizerList;
}
Java は動的ジェネリック ( Class type = Foobar.class; Class<? extends type>
) を処理できないため、ルックアップを実行する別の方法が必要なので、パラメータ化可能なすべての複合型に対して上記のメソッドを実装する必要はありません。
なにか提案を?