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