在Andreas' answer 的基础上,我可以想到几种方法来解决仅在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 方法中可见。而且这种方法的好处是调用者在调用lazyFormat时不需要检查isDebugEnabled方法,所以典型的用法可以是:
logger.debug(lazyFormat("Debug message is %s", someMessage));