0

有没有理由这样做:

private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);

而不是这个?

private static Logger logger = LoggerFactory.getLogger(Main.class);

我不明白其中一个的语法优势是什么。两者似乎都工作正常。

4

6 回答 6

5

这是从 C/C++ 世界继承的约定,即常量命名为大写。由于在 Java 中,最接近常量的等价物是static final,因此这些成员通常以相似的方式命名。

在这种情况下,区别可能并不那么重要,因为logger 对象在语义上不是常量。尽管如此,仍然建议声明它们static以确保每个类只有一个实例,并且您可能希望声明它们final以确保以后不能更改对对象的引用(并将这一事实传达给您的读者代码)。

更新@Moncader 的评论:

  1. static等同于 C++(类)static——就像在 C++ 中将常量声明为非静态一样没有多大意义,在 Java 中也没有意义。

  2. final不是C++ 的直接等价const。这意味着不能更改相关引用。但是,它不会阻止更改引用的对象!int因此,如果它保护原始值(例如)或对不可变对象的引用(例如 ) ,它只能作为 const 工作String。为了保持我们当前的主题,请考虑

    private static final Logger logger = LoggerFactory.getLogger(Main.class); ... logger.setLevel(Level.INFO); logger.addAppender(...); logger.setAdditivity(false);

所有这些调用显然都在改变记录器的状态,即使它是声明的final。这就是我上面所说的 logger 对象在语义上不是常量的意思。

于 2010-09-26T14:34:00.543 回答
3

为什么要定档?

因为这样您就可以确定没有人可以更改当前的记录器。

为什么是 LOGGER 而不是 Logger ?

那是Java约定。常量以大写命名。

声明为类常量的变量名和 ANSI 常量名应全部大写,单词之间用下划线 ("_") 分隔。(为了便于调试,应避免使用 ANSI 常量。)


资源 :

于 2010-09-26T14:33:52.877 回答
2

final意味着您不能将引用更改为指向其他内容。

大写只是一种编码约定,它向读者建议这是一个静态类常量,特别是如果您在引用它时以短类名开头(例如,Foo.LOGGER.info("message");)请参阅1999 Sun Java 编码约定

于 2010-09-26T14:34:06.347 回答
1

一些(不是全部)Java VM 优化了最终常量,从而可以更快地访问您的记录器。因此,如果程序中任何地方的值永远不会改变,请将其设为最终值。

LOGGER is just what Java people do for constants. If you really wanted to make it lower case, there is no difference in terms of performance or anything program-wise.

于 2010-09-26T14:36:06.160 回答
0

如果您使用PMD之类的代码检查工具,那么您会看到 a static final logger(小写)将被标记为警告。

在我之前问过的这个SO question中有更多关于大写与小写记录器的辩论。

于 2010-09-26T15:14:27.973 回答
0

没有功能上的区别。在您的第一个示例中,记录器是一个常量,它永远不会改变。对常量使用全部大写是 Java 惯例。在您的第二个示例中,记录器是静态的,但不是最终的,因此可以通过调用者代码进行更改。你可能不希望这样,所以我会使用第一个选项。

于 2010-09-26T14:35:23.650 回答