Scala中有没有类似Java中Foo.class的类字面量?

3
在Java中,我会写logger.getLogger(NameOfClass.class)。在Scala中该如何编写?

为什么你会称它为“二进制”? - om-nom-nom
4
可能是与此问题类似:Scala中Java ClassName.class 的等价语法是什么? - Dave Griffith
2个回答

9

你可以尝试:

logger.getLogger(getClass())

或者:

logger.getLogger(classOf[NameOfClass])

作为一件小事,ScalaLogging 提供了一种不需要像普通的 java 一样写所有模板代码就能方便地使用带类名的记录器(logger)的方法。你可以在类设置中获得一个已经正确配置好的记录器,而你只需要扩展 Logging 特质即可:
class MyClass extends Logging {
  logger.debug("This is very convenient ;-)")
}

但是你必须在任何想要记录日志的地方添加一个特质吗?对我来说,这似乎更糟。 - Dave L.
但是您不必执行“val logger = logger.getLogger(NameOfClass.class)”或“if(logger.isDebugEnabled)”等操作...因此,它的模板较少,这更好 :) - Noah
2
@david 每次都明确地创建日志记录器不是样板代码吗? - om-nom-nom
@om-nom-nom:我没说过这话吧?我只是认为,我宁愿创建一个val而不是在我的类层次结构中弄乱它们。它们都是样板文件。 - Dave L.
我认为当我想使用另一个日志工具时,使用扩展方法并不是一个好主意,@david。这种方法会污染我创建的类,并且逻辑类应该与日志工具隔离开来。 - Eric_Chen

1
不要忘记在单例 companion 对象中定义记录器:
object MyClass {
    // Commons logging
    private val clLogger = LogFactory.getLog(getClass())

    // java.util.logging
    private val juLogger = Logger.getLogger(getClass().toString)

}

class MyClass {
    import MyClass._

    ...
}

一个应该这样做的原因是,如果你将字段放在class上,它就是一个实例字段,每当该类的对象的new实例时都会返回到日志记录器工厂。对于某些类来说,这可能是不必要或无法接受的性能问题。
Scala将类(静态)字段和实例字段分开,在这种情况下,这比Java要困难得多。这是Scala没有所有优势的情况之一。
class MyClass {
    // Commons logging
    private static final Log clLogger = LogFactory.getLog(MyClass.class)

    // java.util.logging
    private static final Logger juLogger = Logger.getLogger(MyClass.class.toString)

    ...
}

这有点奇怪,只是为了几个静态字段,我还得定义另一个更多的类... - Eric_Chen
虽然有些笨拙,但是另一种选择会在每个类实例的“new”时引入运行时开销(日志工厂)。 - Richard Sitze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接