基于Andreas 的回答,我可以想到几种方法来解决仅在Logger.isDebugEnabled
返回时执行格式化的问题true
:
选项 1:传入“执行格式化”标志
一种选择是有一个方法参数来告诉是否实际执行格式化。一个用例可能是:
System.out.println(lazyFormat(true, "Hello, %s.", "Bob"));
System.out.println(lazyFormat(false, "Hello, %s.", "Dave"));
输出将是:
Hello, Bob.
null
的代码lazyFormat
是:
private String lazyFormat(boolean format, final String s, final Object... o) {
if (format) {
return String.format(s, o);
}
else {
return null;
}
}
在这种情况下,只有在标志设置为时String.format
才会执行,如果设置为,它将返回一个。这将停止记录消息的格式化,并且只会发送一些“虚拟”信息。format
true
false
null
所以记录器的用例可能是:
logger.debug(lazyFormat(logger.isDebugEnabled(), "Message: %s", someValue));
此方法不完全符合问题中要求的格式。
选项 2:检查记录器
另一种方法是直接询问记录器是否isDebugEnabled
:
private static String lazyFormat(final String s, final Object... o) {
if (logger.isDebugEnabled()) {
return String.format(s, o);
}
else {
return null;
}
}
在这种方法中,预计logger
将在lazyFormat
方法中可见。这种方法的好处是调用者在调用时不需要检查isDebugEnabled
方法lazyFormat
,所以典型的用法可以是:
logger.debug(lazyFormat("Debug message is %s", someMessage));