Мы используем кварц (API Java )для планирования заданий. Это хорошо работает. Теперь я пытаюсь обобщить некоторые вещи с ним. API-интерфейсу кварца требуется класс задания в качестве параметра, который расширяет интерфейс задания. Это делает невозможным передачу аргументов через конструктор.
У нас есть набор заданий, которые все должны делать одно и то же: выполнять проверку, если оно истинно, то вызывать действие, например:
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
}
}
Задание кварца затем создается путем вызова:
newJob(classOf[SimpleJob]).with...
Это работает.
Цель состоит в том, чтобы повторно -использовать эту логику для различных типов проверок. Вопрос :Могу ли я использовать систему типов scala таким образом, чтобы иметь один типизированный класс JobClass, который можно -использовать для выполнения любого подкласса Check?
Я нашел следующее решение:
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]])
Это работает, однако я думаю, что создание экземпляра и тип приведения -обходит всю идею типа -проверка. Есть ли лучший способ сделать это? Может быть, нам стоит переосмыслить и наш дизайн...
Спасибо, Альберт