从性能或其他角度来看,将所有用于日志记录的文本声明为 public static final 是个好主意吗?
如果一个字符串只使用一次,它除了可读性之外还有什么优势吗?
请您参考如下方法:
首先,您问题的客观部分:将日志语句声明为 static final 是否有性能优势,即:
private static final String SUCCESS = "Success!";
//[...]
log.info(SUCCESS);
log.info(SUCCESS);
// versus:
log.info("Success!");
log.info("Success!");
JLS 在 section 3.10.5 中声明:
[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.
因此,无论您的字符串字面量是作为static final
声明一次还是在源代码中出现多次,它始终是相同的字符串实例,无论它在哪里使用,因此占用相同数量的内存,并且将以完全相同的方式访问。不会有性能差异。
现在是问题的另一部分:这是个好主意吗?这本质上是主观的,但我的意见是您应该避免将日志消息声明为 static final
。日志消息增加了代码的可读性,当代码由未编写代码的人维护时,这尤其有值(value)。例如:
log.warn(LOGIN_ERROR_OCCURRED, userId, attempt);
// compared to:
log.warn("Login failed for user {}; attempt {} of 5.", userId, attempt);
在代码的上下文中阅读日志消息更快更容易,而不是必须跳到代码中的其他地方才能看到完整的日志消息。