Skip to main content
 首页 » 编程设计

java之将所有用于日志记录的文本声明为 public static final 是个好主意吗

2024年08月06日17lyj

从性能或其他角度来看,将所有用于日志记录的文本声明为 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); 

在代码的上下文中阅读日志消息更快更容易,而不是必须跳到代码中的其他地方才能看到完整的日志消息。