加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何登录Scala * * * *每个实例*中的引用记录器?

发布时间:2020-12-16 09:36:38 所属栏目:安全 来源:网络整理
导读:我已经看过登录Scala的例子,它通常看起来像这样: import org.slf4j.LoggerFactorytrait Loggable { private lazy val logger = LoggerFactory.getLogger(getClass) protected def debug(msg: = AnyRef,t: = Throwable = null): Unit = {...}} 这似乎独立于
我已经看过登录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的任何好处。

解决方法

How do I declare in a trait that the
implementing class must have a
singleton object of type X,and that
this singleton object must be
accessible through method def x: X ?

声明必须由您的伴随对象实现的特征。

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
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读