以全部大写形式声明记录器并使其成为最终记录是否有所不同?

时间:2010-09-26 14:31:20

标签: java syntax static final uppercase

有没有理由这样做:

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

而不是这个?

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

我不承认一个人的语法上的好处是什么。两者似乎都很好。

6 个答案:

答案 0 :(得分:5)

继承自C / C ++世界的惯例是常量被命名为全部大写。因为在Java中,最接近的常量等价是static final,所以这些成员的名称通常相似。

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

更新@Moncader的评论:

  1. static相当于C ++(class)static - 就像在C ++中将常量声明为非静态一样没有多大意义,它没有意义在Java中。

  2. final 直接等同于C ++ const。这意味着有问题的参考不能改变。但是,它并不妨碍更改所引用的对象!因此,如果它保护原始值(例如int)或对不可变对象的引用(例如String),它仅作为const工作。要继续我们当前的主题,请考虑

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

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

答案 1 :(得分:3)

为何选择最终?

因为这样你可以确定没有人可以改变当前的记录器。

为什么选择LOGGER而非Logger?

这是一个Java惯例。常量以大写字母命名。

  

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


资源:

答案 2 :(得分:2)

final表示您无法将引用更改为指向其他内容。

大写只是一种编码约定,向读者建议这是一个静态类常量,特别是如果你在引用它时用短类名称作为前缀(例如,Foo.LOGGER.info("message");)请参阅{{ 3}}

答案 3 :(得分:1)

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

LOGGER正是Java人们为常量所做的事情。如果你真的想把它做成小写,那么在性能或程序方面没有任何区别。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

this SO问题中,上述与小写的记录器争论还有很多,我之前曾问过这个问题。