[A] string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.
# 1 楼答案
首先,问题的目标部分:声明日志语句static final是否有性能优势,即:
JLS在section 3.10.5中指出:
因此,无论您的字符串文本是一次性声明为
static final
还是在源代码中多次出现,无论在何处使用,它都将始终是相同的字符串实例,因此占用相同的内存量,并且将以完全相同的方式访问。不会有性能差异现在问题的另一部分:这是个好主意吗?这本质上是主观的,但我的观点是,应该避免将日志消息声明为
static final
。日志消息增加了代码的可读性,当代码由未编写它的人维护时,这一点尤为重要。例如:在代码上下文中读取日志消息要快得多,也容易得多,而不必跳转到代码中的其他地方才能看到完整的日志消息
# 2 楼答案
更容易的国际化和本地化是为字符串常量使用标识符的可能优势
但是i18n/L10n对于日志消息的好处可能值得怀疑
# 3 楼答案
日志字符串几乎肯定不应该被声明为
public
,至少通常不应该。在大多数情况下,最好为它们声明常量变量,但有时您可能会对此感到不安。常量应该一起出现在类源的顶部附近,因此对于记录字符串,这可以很好地概述类中发生的情况。它还可以更容易地找到它们进行维护,比如编辑掉愚蠢的无关感叹号。(别笑,我见过他们。)我不同意他们模糊了日志消息的意义,除非你不擅长命名变量。太多人都这么做了