Я посмотрел пример регистрации в Scala, и он обычно выглядит так:
import org.slf4j.LoggerFactory
trait Loggable {
private lazy val logger = LoggerFactory.getLogger(getClass)
protected def debug(msg: => AnyRef, t: => Throwable = null): Unit =
{...}
}
Это кажется независимым от конкретной структуры ведения журнала.В то время как это делает работу, оно также вводит посторонний ленивый val в каждом экземпляре , который хочет вести журналирование, которое вполне может быть каждым экземпляром всего приложения.Это кажется мне слишком тяжелым, в частности, если у вас много «маленьких экземпляров» определенного типа.
Есть ли способ поместить регистратор в объект конкретного класса, просто используя наследование?Если мне нужно явно объявить регистратор в объекте класса и явно ссылаться на него из класса / свойства, то я написал почти столько же кода, как если бы я вообще не использовал повторно.
Выраженная в контексте, не связанном с журналированием, проблема будет выглядеть следующим образом:
Как я могу объявить в признаке, что реализующий класс должен иметь одноэлементный объект типа X, и что этот одноэлементный объект должен быть доступен через методdef x: X?
Я не могу просто определить абстрактный метод, потому что в классе может быть только одна реализация.Я хочу, чтобы при входе в суперкласс я получал синглтон суперкласса, а при входе в подкласс я получал синглтон подкласса.Или, проще говоря, я хочу, чтобы регистрация в Scala работала так же, как традиционная регистрация в Java, с использованием статических регистраторов, специфичных для класса, выполняющего регистрацию.Мои нынешние знания о Scala говорят мне, что это просто невозможно без того, чтобы делать это точно так же, как вы делаете в Java, без особой пользы от использования «лучшего» Scala.