Answers:
这是关于字符串连接性能。如果您有密集的日志记录语句,这可能会很重要。
(SLF4J 1.7之前)但只能有两个参数
因为绝大多数的日志记录语句具有2个或更少的参数,所以SLF4J API最高版本为1.6涵盖(仅)大多数用例。从API版本1.7开始,API设计人员就提供了带有varargs参数的重载方法。
对于那些需要大于2且使用1.7之前的SLF4J的情况,则只需使用字符串串联或即可new Object[] { param1, param2, param3, ... }
。它们应该很少,以至于性能并不那么重要。
简短版:是的,它更快,代码更少!
字符串连接在不知道是否需要字符串连接的情况下做了很多工作(log4j中已知传统的“已启用调试”测试),并且应尽可能避免,因为{}允许延迟toString()调用和字符串构造确定事件是否需要捕获之后的时间。我认为,通过使记录器格式化单个字符串,代码将变得更加简洁。
您可以提供任意数量的参数。请注意,如果您使用的是sljf4j的旧版本,并且具有多个参数{}
,则必须使用new Object[]{a,b,c,d}
语法来传递数组。参见例如http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String,java.lang.Object [])。
关于速度:Ceki在其中一个列表上发布了基准测试。
debug(String format, Object... arguments)
。参见slf4j.org/faq.html#logging_performance
由于String 在Java中是不可变的,因此对于每对串联,必须将左右String复制到新String中。因此,最好选择占位符。
另一个选择是String.format()
。我们在jcabi-log(slf4j周围的静态实用程序包装器)中使用它。
Logger.debug(this, "some variable = %s", value);
它更具可维护性和可扩展性。此外,它很容易翻译。
value
更改类型,则必须返回并更改日志记录语句。IDE不能帮您的忙。记录器应协助调试,不要妨碍调试。:-)
String.format("%d", "Test")
产生IntelliJ警告Argument type 'String' does not match the type of the format specifier '%d'.
。但是,我不确定在使用上述解决方案时它是否仍然能够提供这种智能响应。
我认为从作者的角度来看,主要原因是为了减少字符串连接的开销。我刚刚阅读了记录器的文档,您会发现以下几句话:
/**
* <p>This form avoids superfluous string concatenation when the logger
* is disabled for the DEBUG level. However, this variant incurs the hidden
* (and relatively small) cost of creating an <code>Object[]</code> before
invoking the method,
* even if this logger is disabled for DEBUG. The variants taking
* {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
* arguments exist solely in order to avoid this hidden cost.</p>
*/
*
* @param format the format string
* @param arguments a list of 3 or more arguments
*/
public void debug(String format, Object... arguments);