Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将用于日志记录的所有文本声明为公共静态最终文本是一个好主意吗_Java_Logging_Log4j - Fatal编程技术网

Java 将用于日志记录的所有文本声明为公共静态最终文本是一个好主意吗

Java 将用于日志记录的所有文本声明为公共静态最终文本是一个好主意吗,java,logging,log4j,Java,Logging,Log4j,从性能的角度或其他方面来看,将日志记录使用的所有文本声明为公共静态最终文本是一个好主意吗 在一个字符串只被使用一次的情况下,除了可读性之外,它还有其他优势吗 首先,问题的目标部分是:声明日志语句static final是否有性能优势,即: private static final String SUCCESS = "Success!"; //[...] log.info(SUCCESS); log.info(SUCCESS); // versus: log.info("Success!"); l

从性能的角度或其他方面来看,将日志记录使用的所有文本声明为公共静态最终文本是一个好主意吗


在一个字符串只被使用一次的情况下,除了可读性之外,它还有其他优势吗

首先,问题的目标部分是:声明日志语句static final是否有性能优势,即:

private static final String SUCCESS = "Success!";
//[...]
log.info(SUCCESS);
log.info(SUCCESS);
// versus:
log.info("Success!");
log.info("Success!");
联合联络小组指出:

[A] 字符串文字总是指类字符串的同一实例。这是因为字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”,以便使用string.intern方法共享唯一实例

因此,无论您的字符串文本是一次性声明为
静态final
,还是在源代码中多次出现,无论在何处使用,它都将始终是相同的字符串实例,因此占用相同的内存量,并且将以完全相同的方式访问。不会有性能差异

现在问题的另一部分:这是个好主意吗?这本质上是主观的,但我的观点是,应该避免将日志消息声明为
静态final
。日志消息增加了代码的可读性,当代码由未编写它的人维护时,这一点尤为重要。例如:

log.warn(LOGIN_ERROR_OCCURRED, userId, attempt);
// compared to:
log.warn("Login failed for user {}; attempt {} of 5.", userId, attempt);

在代码上下文中读取日志消息要快得多,也容易得多,而不必跳转到代码中的其他地方才能看到完整的日志消息。

使用字符串常量标识符可能会更容易国际化和本地化

ResourceBundle bundle = ...
private final static LOGIN_ERROR_OCCURRED = bundle.getString("Login failed for user {}; attempt {} of 5");

但是i18n/L10n对于日志消息的好处可能值得怀疑。

日志字符串几乎肯定不应该声明为公共的,至少通常不应该。在大多数情况下,最好为它们声明常量变量,但有时您可能会对此感到不安。常量应该一起出现在类源的顶部附近,因此对于记录字符串,这可以很好地概述类中发生的情况。它还可以更容易地找到它们进行维护,比如编辑掉愚蠢的无关感叹号。(别笑,我见过他们。)我不同意他们掩盖了日志消息的意义,除非你不擅长命名变量。有太多人这么做。

我问这个问题的方式有什么不对吗?请建议,我将其更改为“String getting used for logging”--您是指用作日志消息的文本值吗?如果是这样的话,也不是真的——在Java中查找字符串常量interning。是的,这就是我的意思。编辑问题,明确地说。感谢您的评论。它可以通过删除分散注意力的字符串来帮助清理代码。它还可以方便地在单个位置调整类的日志消息。我看不出有什么问题。谢谢你,布兰登。但从性能或内存优化的角度来看,这几乎没有什么区别,对吧?非常感谢您的回复。但是我没有完全理解它,你能详细解释一下吗?国际化(通常缩写为“i18n”,因为在第一个字母和最后一个字母之间有18个字母)使你的程序可以用各种语言工作。本地化(或“L10n”)将其扩展到语言变体。允许您的程序以用户的语言显示消息和菜单是一件好事。日志消息通常只由开发人员读取,可能无法从中获益,如果开发人员无法将日志翻译回他们的语言,则可能会使日志对他们毫无用处。同样,一些程序是由国际社会开发的。一个很好的观点是,国际化是使用标识符有意义的时代之一。我还没有做过一个可以从国际化日志消息中获益的项目,但这并不是说它们不存在。