У меня есть абстрактный класс (библиотека Java), который принимает аргументы конструктора и имеет метод с именем execute
, который я хочу украсить:
public abstract class Task {
private final String name;
protected Task(String name) {
this.name = name;
}
public abstract void execute(String str) throws Exception
}
И у меня есть классы Scala, которые в настоящее время наследуют предыдущий:
class FooTask extends Task("fooTask") {
override def execute(str: String): Unit = println(str + "foo")
}
class BarTask extends Task("barTask") {
override def execute(str: Strin): Unit = println(str + "bar")
}
Можно ли написать декоратор для класса Task следующим образом:
trait TaskWithErrorLogging { self: Task =>
override def execute(str: String): Unit =
Try(self.execute(str)) match {
case Failure(exception) =>
println("LOGGED " + exception)
throw exception;
case _ =>
}
}
А затем использовать его для регистрации ошибок?
class BarTask extends Task("barTask") with TaskWithErrorLogging {
override def execute(str: String): Unit = println(str + "bar") // Error should be logged
}
Эти задачи автоматически создаются инжектором фреймворка, поэтому нет возможности записать new FooTask with TaskWithErrorLogging
В настоящее время переопределенный метод декоратора игнорируется (он компилируется, но невыполнение).Добавление модификатора abstract
к методу в декораторе не компилируется.Как правильно реализовать это решение для ведения журнала?Может быть, есть и другой вариант, кроме черты стека?