什么是Scala的Java类文字模拟,例如。让Foo.class?

时间:2013-04-02 14:19:56

标签: scala

在Java中我会写logger.getLogger(NameOfClass.class)。如何在Scala中编写相同的内容?

2 个答案:

答案 0 :(得分:9)

你可以尝试:

logger.getLogger(getClass())

或:

logger.getLogger(classOf[NameOfClass])

作为旁注,ScalaLogging提供了一种简单易用的方法来使用具有类名的记录器,但没有像普通java那样的所有样板文件。您可以在类设置中正确获取记录器,所有您需要做的就是扩展特征Logging

class MyClass extends Logging {
  logger.debug("This is very convenient ;-)")
}

答案 1 :(得分:1)

不要忘记在单身伴侣对象上定义记录器:

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)

    ...
}