有没有理由这样做:
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
而不是这个?
private static Logger logger = LoggerFactory.getLogger(Main.class);
我不承认一个人的语法上的好处是什么。两者似乎都很好。
答案 0 :(得分:5)
继承自C / C ++世界的惯例是常量被命名为全部大写。因为在Java中,最接近的常量等价是static final
,所以这些成员的名称通常相似。
在这种情况下,区别可能不那么重要,因为记录器对象在语义上不是常量。尽管如此,仍然建议声明它们static
以确保每个类都有一个实例,并且您可能希望声明它们final
以确保以后不能更改对象的引用(并将此事实传达给您的代码的读者)。
更新@Moncader的评论:
static
相当于C ++(class)static
- 就像在C ++中将常量声明为非静态一样没有多大意义,它没有意义在Java中。
final
不直接等同于C ++ const
。这意味着有问题的参考不能改变。但是,它并不妨碍更改所引用的对象!因此,如果它保护原始值(例如int
)或对不可变对象的引用(例如String
),它仅作为const工作。要继续我们当前的主题,请考虑
private static final Logger logger = LoggerFactory.getLogger(Main.class); ... logger.setLevel(Level.INFO); logger.addAppender(...); logger.setAdditivity(假);
所有这些调用显然都会改变记录器的状态,即使它被声明为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)