私のアプリには、タスクを表すオブジェクトがあります(DBに保存されています)。タスクの実際の実装(いくつかのビジネスロジック)を持つオブジェクトもあります-それらをランナーと呼びましょう。したがって、ランナーは次のインターフェースを実装できます。
public interface Runner<T> {
void run(T task);
}
タスクオブジェクトが与えられた場合、それを実行できるように、ランナーを作成/取得するための優れた方法が必要です。
私は次のようなものを避けたいです
if(task instance of DoSomethingTask) {
return new DoSomethingTaskRunner();
} else if(task instance of DoSomethingElseTask) {
return new DoSomethingElseRunner();
}
新しいランナーを作成するときはいつでも、上記のブロックに別のif/elseを追加することを忘れないでください。実装するランナーを自動的に取得するだけでよいでしょう
Runner<myTask.getClass()> // pseudocode ;)
これを行う良い方法は、タスクに「getRunner」メソッドを持たせることです(メソッドを実装する必要がある新しいタスクを追加して、忘れられないようにします)が、残念ながらプロジェクトの依存関係のため、タスクオブジェクトはランナーについて何も知ることができません。
良い方法でそれを行う方法に関するアイデアはありますか?
ところで:私はSpringを使用しているので、渡されたタスクに基づいてランナーBeanを取得する方がさらに良いでしょう。