【发布时间】:2018-05-02 22:05:21
【问题描述】:
我经常听到人们说,在记录时避免使用String Concatenation 而使用{} 是最佳实践之一。
我正在查看Log4j 代码,看看他们是如何处理这个问题的,并认为他们正在做类似的事情。
这是format() 方法的 sn-p 方法,它采用模式和参数并返回要记录的消息。
/**
* Formats arguments using SLF4J-like formatter.
* @param pattern pattern, may be malformed.
* @param arguments arguments.
* @return Message string
*/
private static String format(final String pattern,
final Object[] arguments) {
if (pattern != null) {
String retval = "";
int count = 0;
int prev = 0;
int pos = pattern.indexOf("{");
while(pos >= 0) {
if (pos == 0 || pattern.charAt(pos-1) != '\\') {
retval += pattern.substring(prev, pos);
if (pos + 1 < pattern.length() && pattern.charAt(pos+1) == '}') {
if(arguments != null && count < arguments.length) {
retval += arguments[count++];
} else {
retval += "{}";
}
prev = pos + 2;
} else {
retval += "{";
prev = pos + 1;
}
} else {
retval += pattern.substring(prev, pos - 1) + "{";
prev = pos + 1;
}
pos = pattern.indexOf("{", prev);
}
return retval + pattern.substring(prev);
}
return null;
}
我无法理解这种实现比使用串联更好。对此的任何见解都会非常有帮助。
【问题讨论】:
-
如果你有一个超长的字符串需要用“+”分隔以提高可读性,会发生什么。但是您仍然保留“{}”占位符。
logger.debug("Very very very very very very very very very very very very very" + " very very very very long {}", textName);
标签: java performance logging log4j