Если вы действительно беспокоитесь о нехватке места и / или дополнительном времени в инициализаторах объектов, хорошей стратегией может быть наличие признака ведения журнала, который оставляет абстрактное значение для регистратора, как в
trait Logging {
def logger: Logger
def debug(message: String) { logger.debug(message) }
def warn(message: String) { logger.warn(message) }
}
Для классов, которые должны быть максимально легкими, вы можете сделать
object MustBeLightweight {
val logger = Logger.getLog(classOf[MustBeLightweight])
}
class MustBeLightWeight extends Logging {
final def logger = MustBeLightweight.logger
}
В этом случае JIT может быть даже встроенным debug
warn
и logger
.
Вы также можете иметь черту, которую можно смешивать для классов, в которых дополнительные поля не являются проблемой
trait PerInstanceLog {
val logger = Logger.getLog(this.getClass())
}
Еще один вариант - оставить выход из класса и полностью поместить его в объект, как в
object Foo {
object log extends Logging {
override val logger = Logger.getLogger(classOf[Foo])
}
}
class Foo {
import Foo.log._
def someMethod() = { warn("xyz") }
}
Я согласен с Кевином, не добавляйте сложность, если она вам не нужна.