SB.*_*SB. 5 java logging slf4j
我们正在使用SLF4J
基于团队最近的讨论
if(LOG.isDebugEnabled()){
LOG.debug("hello " + a + " world" + b);
}
Run Code Online (Sandbox Code Playgroud)
比...更好
LOG.debug("hello {} world {}", a, b);
Run Code Online (Sandbox Code Playgroud)
因为在后一种情况下,hello {} world {}即使未启用"debug" ,也会创建String .换句话说,即使不需要,我们也总是创建字符串.
我喜欢后一版本,因为它显着提高了可读性.
有人可以提供意见吗?
问候,
Shardul.
编辑
让我换一点吧.
哪种方法更好?或者哪种方法最受欢迎?
Shardul.
Tom*_*icz 15
不,较短的版本不会创建 " hello {} world {}"字符串.在编译和类加载期间,该字符串已创建并放置在常量池中.您始终从常量池引用相同的实例,它与引用常量一样便宜int.
但字符串是在第一个形式,因为你使用字符串连接创建.
唯一的额外开销是调用LOG.debug三个参数,它们在isDebugEnabled()内部调用时什么也不做.它也有可能被内联.
话虽如此,我会在99%的情况下采用缩短形式.我明确调用的唯一情况isDebugEnabled是计算要记录的消息时会产生很大的成本:
if(LOG.isDebugEnabled()){
LOG.debug("hello {} world {}", cheap, veryExpensive());
}
Run Code Online (Sandbox Code Playgroud)
如果veryExpensive()是,ekhem,非常昂贵,那么如果它被丢弃则避免调用它是明智的.BTW veryExpensive()不应该有任何副作用,很难想象长效,无副作用的方法......