gpt4 book ai didi

scala - 如何*在*每个实例*中*无*登录Scala?

转载 作者:行者123 更新时间:2023-12-03 11:41:58 25 4
gpt4 key购买 nike

我看过登录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访问此单例对象?

我不能简单地定义一个抽象方法,因为该类中只能有一个实现。我希望登录父类(super class)可以使我获得父类(super class)单例,而登录子类可以使我获得子类单例。或更简单地说,我希望使用特定于该类的静态记录器,使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)
}

为您的类创建一个基本特征,子类必须覆盖meta方法。
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")
}
}

这样,您只需要引用元对象。

我们可以这样使用Whatever类。
object Sample {
def main(args: Array[String]) {
val whatever = new Whatever
whatever.doSomething
}
}

关于scala - 如何*在*每个实例*中*无*登录Scala?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6466190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com