有没有理由这样做:
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
而不是这个?
private static Logger logger = LoggerFactory.getLogger(Main.class);
我不明白其中一个的语法优势是什么。两者似乎都工作正常。
这是从 C/C++ 世界继承的约定,即常量命名为大写。由于在 Java 中,最接近常量的等价物是static final
,因此这些成员通常以相似的方式命名。
在这种情况下,区别可能并不那么重要,因为logger 对象在语义上不是常量。尽管如此,仍然建议声明它们static
以确保每个类只有一个实例,并且您可能希望声明它们final
以确保以后不能更改对对象的引用(并将这一事实传达给您的读者代码)。
更新@Moncader 的评论:
static
等同于 C++(类)static
——就像在 C++ 中将常量声明为非静态一样没有多大意义,在 Java 中也没有意义。
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 对象在语义上不是常量的意思。
为什么要定档?
因为这样您就可以确定没有人可以更改当前的记录器。
为什么是 LOGGER 而不是 Logger ?
那是Java约定。常量以大写命名。
声明为类常量的变量名和 ANSI 常量名应全部大写,单词之间用下划线 ("_") 分隔。(为了便于调试,应避免使用 ANSI 常量。)
资源 :
final
意味着您不能将引用更改为指向其他内容。
大写只是一种编码约定,它向读者建议这是一个静态类常量,特别是如果您在引用它时以短类名开头(例如,Foo.LOGGER.info("message");
)请参阅1999 Sun Java 编码约定。
一些(不是全部)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.
没有功能上的区别。在您的第一个示例中,记录器是一个常量,它永远不会改变。对常量使用全部大写是 Java 惯例。在您的第二个示例中,记录器是静态的,但不是最终的,因此可以通过调用者代码进行更改。你可能不希望这样,所以我会使用第一个选项。