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

Lin*_*inc 0 java syntax static final uppercase

有什么理由这样做:

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

而不是这个?

private static Logger logger = LoggerFactory.getLogger(Main.class);
Run Code Online (Sandbox Code Playgroud)

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

Pét*_*rök 5

它是一个从C/C++世界继承的约定,常量被命名为全大写.因为在Java中,最接近等价的常量是static final,这些成员通常被命名为相似.

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

更新@Moncader的评论:

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

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

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

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