Scala :Создание универсального класса Quartz Job

Мы используем кварц (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]])

Это работает, однако я думаю, что создание экземпляра и тип приведения -обходит всю идею типа -проверка. Есть ли лучший способ сделать это? Может быть, нам стоит переосмыслить и наш дизайн...

Спасибо, Альберт

5
задан Albert 7 May 2012 в 12:37
поделиться