如何登录Scala * * * *每个实例*中的引用记录器?
我已经看过登录Scala的例子,它通常看起来像这样:
import org.slf4j.LoggerFactory trait Loggable { private lazy val logger = LoggerFactory.getLogger(getClass) protected def debug(msg: => AnyRef,t: => Throwable = null): Unit = {...} } 这似乎独立于具体的日志框架。虽然这样做的工作,它还引入了一个无关的懒惰值,在每一个想要做日志记录的实例中,这可能是整个应用程序的每一个实例。这似乎对我来说太重了,特别是如果你有很多特定类型的“小实例”。 有没有办法将logger放在具体类的对象中,而只是使用继承?如果我必须在类的对象中明确声明logger,并且从类/ trait中明确地引用它,那么我已经编写了几乎一样多的代码,就好像我完全没有重用。 在非日志记录特定的上下文中表示,问题是: 如何声明实现类必须具有类型X的单例对象,并且该单例对象必须可以通过方法def x:X访问? 我不能简单地定义一个抽象方法,因为在类中只能有一个实现。我希望登录一个超级类可以让我得到超级单例,登录子类可以让我得到子类单例。或者更简单地说,我想要登录Scala工作像传统的Java日志记录一样,使用静态日志记录器,该日志记录器是专门针对日志记录的类。我目前对Scala的了解告诉我,这完全不可能,而不用像Java那样完全一样,没有使用“更好的”Scala的任何好处。 解决方法
声明必须由您的伴随对象实现的特征。 trait Meta[Base] { val logger = LoggerFactory.getLogger(getClass) } 为您的类创建基本特征,子类必须覆盖元方法。 trait Base { def meta: Meta[Base] def logger = meta.logger } 一个类与伴随对象无关: object Whatever extends Meta[Base] class Whatever extends Base { def meta = Whatever def doSomething = { logger.log("oops") } } 这样你只需要对元对象的引用。 我们可以使用这样的任何类。 object Sample { def main(args: Array[String]) { val whatever = new Whatever whatever.doSomething } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |