ジョブのスケジューリングには Quartz (Java API) を使用しています。これはうまくいきます。今、私はいくつかのことを一般化しようとしています。Quartz API には、Job インターフェースを拡張するパラメーターとしてジョブ クラスが必要です。これにより、コンストラクターを介して引数を渡すことができなくなります。
すべて同じことを行い、チェックを実行し、true の場合はアクションを呼び出す一連のジョブがあります。次に例を示します。
class SimpleJob extends Job {
def execute(context: JobExecutionContext) {
val check = classOf[SimpleCheck].asInstanceOf[Class[Check]].newInstance()
val result = check.execute(context.getJobDetail.getJobDataMap)
if (result.shouldInvokeAction) {
Action(result).execute
}
}
Quartz ジョブは、次の呼び出しによってインスタンス化されます。
newJob(classOf[SimpleJob]).with...
これは機能します。
目標は、このロジックをさまざまなタイプのチェックに再利用することです 質問: Check の任意のサブクラスを実行するために再利用できる 1 つの型付き JobClass を持つことができるような方法で、scala 型システムを使用できますか?
私は次の解決策を思いつきました:
class GenericJobRule[J <: Check](implicit m: Manifest[J]) extends Job {
def execute(context: JobExecutionContext) {
val check = m.erasure.newInstance().asInstanceOf[J]
val result = check.execute(context.getJobDetail.getJobDataMap)
if (result.shouldInvokeAction) {
Action(result).execute
}
}
}
ジョブは次のようにインスタンス化できるようになりました:
newJob(classOf[GenericJobRule[PerformanceCheck]])
これは機能しますが、インスタンス化とキャストは、タイプチェックのアイデア全体をバイパスしていると思います。これを行うより良い方法はありますか?デザインも考え直した方がいいのかな…
ありがとう、アルバート