为什么我们声明Loggers静态最终?

use*_*041 120 java logging

在Java中,为什么最佳做法是声明记录器static final

private static final Logger S_LOGGER
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 198

  • private- 这样任何其他类都无法劫持您的记录器
  • static - 因此每个类只有一个记录器实例,也避免了序列化记录器的尝试
  • final - 无需在课程的整个生命周期内更改记录器

此外,我更喜欢名称log尽可能简单,但更具描述性.

编辑:但是这些规则有一个有趣的例外:

protected final Logger log = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)

而不是:

private static final Logger log = LoggerFactory.getLogger(Foo.class);
Run Code Online (Sandbox Code Playgroud)

前一种方法允许您在整个继承层次结构中的所有类中使用相同的记录器名称(实际类的名称).因此,如果Bar扩展Foo,两者都将记录到Bar记录器.有些人觉得它更直观.

  • *@ zacheusz*,我知道,这就是重点.有些人虔诚地遵循Java命名约定(没有错),但我更喜欢更容易编写,更喜欢读取`log`名称,而不是用"LOG"散布代码.只是开发的问题.团队协议. (38认同)
  • 如果静态和最终然后宁可LOG(大写) (33认同)
  • 请注意,不再总是建议将logger声明为static和final,请参阅http://slf4j.org/faq.html#declared_static和http://wiki.apache.org/commons/Logging/FrequentlyAskedQuestions部分我应该声明日志引用是否静态? (27认同)
  • @zacheusz大写字段名称用于常量.记录器不是恒定的.[http://stackoverflow.com/questions/1417190/should-a-static-final-logger-be-declared-in-upper-case](http://stackoverflow.com/questions/1417190/should-a-静态最终记录待宣布合大写) (6认同)
  • @zacheusz并非所有静态最终属性都应该是大写的:http://stackoverflow.com/questions/1417190/should-a-static-final-logger-be-declared-in-upper-case (2认同)

yeg*_*256 12

查看此博文:摆脱Java静态记录器.这是你如何使用slf4j与jcabi-log:

import com.jcabi.log.Logger;
class Foo {
  void save(File f) {
    Logger.info(this, "file %s saved successfully", f);
  }
}
Run Code Online (Sandbox Code Playgroud)

永远不要再使用静电噪音了.

  • 每次写更长的Logger ..(this,...).罗. (11认同)

Jon*_*eet 7

您什么时候想要更改该字段的值?

如果您永远不会更改该值,则将该字段设置为 Final 会明显表明您永远不会更改该值。

  • @Dima:嗯,我仍然很感激,如果我*确实*不小心尝试在这些情况下更改值,编译器仍然会抛出错误...... (7认同)

And*_*yle 5

static意味着每个类只能创建一个Logger,而每个类实例不能创建一个Logger 。通常,这就是您想要的-因为记录器往往仅根据类而有所不同。

final表示您不会更改logger变量的值。的确如此,因为您几乎总是将所有日志消息(来自一个类)扔给同一记录器。即使在极少数的情况下,一个类可能希望向其他记录器发送一些消息,创建另一个记录器变量(例如widgetDetailLogger)也要比动态更改静态变量的值更为清晰。