【问题标题】:What is Scala's analog for Java's class literal, e.g. Foo.class?Scala 对 Java 类文字的模拟是什么,例如Foo.class?
【发布时间】:2014-12-27 05:24:26
【问题描述】:

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

【问题讨论】:

标签: scala


【解决方案1】:

你可以试试:

logger.getLogger(getClass())

或:

logger.getLogger(classOf[NameOfClass])

附带说明,ScalaLogging 提供了一种简单易用的方法来使用具有类名的记录器,但没有像普通 java 那样的所有样板。你在你的类设置中得到了一个记录器,你所要做的就是扩展一个特征Logging

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

【讨论】:

  • 但是你必须在任何你想记录的地方添加一个特征?对我来说,这似乎是更糟糕的样板。
  • 但是您不必执行 'val logger = logger.getLogger(NameOfClass.class)' 或 'if (logger.isDebugEnabled)' 等...所以它的样板更少,哪个更好: )
  • @david 每次都明确创建记录器不是样板文件吗?
  • @om-nom-nom:我没说是吗?我只是认为我宁愿创建一个 val 而不是弄乱我的类层次结构。它们都是样板。
  • 当我想使用另一个日志工具@david 时,我认为这不是一个好主意。 extends 那种方法只会污染我创建的类,逻辑类应该用日志工具隔离
【解决方案2】:

不要忘记在单例伴随对象上定义记录器:

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)

    ...
}

【讨论】:

  • 这有点奇怪,只是为了几个静态字段,我又定义了另一个类...
  • 这很笨拙,但替代方案会在类实例的每个 new 上引入运行时开销(日志工厂)。
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2010-10-21
  • 2011-12-09
相关资源
最近更新 更多