Java 用大写字母声明一个记录器并使其成为最终版本会有区别吗?

Java 用大写字母声明一个记录器并使其成为最终版本会有区别吗?,java,syntax,static,final,uppercase,Java,Syntax,Static,Final,Uppercase,是否有任何理由这样做: private static final Logger LOGGER = LoggerFactory.getLogger(Main.class); 而不是这个 private static Logger logger = LoggerFactory.getLogger(Main.class); 我不明白其中一个在句法上比另一个有什么好处。两者似乎都很好。为什么要定为最终版本 因为这样可以确保没有人可以更改当前记录器 为什么是记录器而不是记录器 这是一个Java约定。常

是否有任何理由这样做:

private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
而不是这个

private static Logger logger = LoggerFactory.getLogger(Main.class);
我不明白其中一个在句法上比另一个有什么好处。两者似乎都很好。

为什么要定为最终版本

因为这样可以确保没有人可以更改当前记录器

为什么是记录器而不是记录器

这是一个Java约定。常量以大写字母命名

声明类常量的变量和ANSI常量的名称应全部大写,并用下划线分隔。为便于调试,应避免使用ANSI常量

资源:


这是从C/C++世界继承下来的一个惯例,即常量的名称都是大写的。因为在Java中,最接近常量的等价物是static final,所以这些成员的名称通常类似

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

更新@Moncader的评论:

静态等同于C++类静态——就像C++中声明常量不太静态一样,它在java中也没有意义。

最终不是直接等价于C++ const。这意味着有关的参考资料不能更改。但是,这并不阻止更改所引用的对象!因此,只有当它保护一个原语值(例如int)或一个不可变对象(例如String)的引用时,它才作为常量工作。要继续我们当前的主题,请考虑

专用静态最终记录器Logger=LoggerFactory.getLoggerMain.class; ... logger.setlevel.INFO; 记录器。addAppender。。。; logger.setAdditivityfalse

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

final意味着您不能更改引用以指向其他对象


大写字母只是一种编码约定,它向读者建议这是一个静态类常量,特别是在引用它时,如果您在前面加上短类名,例如Foo.LOGGER.infomessage;请参阅。

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

有些并非所有的Java虚拟机都会优化最终常量,从而加快对记录器的访问。因此,如果程序中的某个值永远不会更改,请将其设置为最终值


记录器正是Java人员对常量所做的。如果您真的想使其小写,那么在性能或程序方面没有任何区别。

如果您使用类似的代码检查工具,那么您将看到静态最终记录器小写将被标记为警告


关于SO问题中的大写与小写记录器的争论还有更多内容,这是我之前问过的。

相关:我相信JVM无论如何都能看到引用从未更改,因此final可能不会对这一点产生影响,但再次,我不是JVM专家。static与C/C++const无关,与它们完全没有关系。final是const的直接翻译。静态是完全不同的。