使用{}
代替字符串连接有什么好处吗?
来自slf4j的一个例子
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
而不是
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
我认为这是关于速度优化的,因为根据配置文件,可以在运行时避免参数评估(和字符串连接)。但是只有两个参数是可能的,那么有时除了字符串连接之外别无选择。需要就此问题提出意见。
答案 0 :(得分:58)
关于字符串连接性能。如果你有密集的日志记录,这可能很重要。
(在SLF4J 1.7之前)但只有两个参数可能
由于绝大多数日志记录语句都有2个或更少的参数,因此最高版本1.6的SLF4J API涵盖(仅)大多数用例。自API版本1.7以来,API设计人员已经为重载方法提供了varargs参数。
对于那些需要2个以上并且你坚持使用1.7之前的SLF4J的情况,那么只需使用字符串连接或new Object[] { param1, param2, param3, ... }
。它们应该足够少,表现不那么重要。
答案 1 :(得分:36)
简短版:是的,速度更快,代码更少!
字符串连接在不知道是否需要的情况下完成了大量工作(传统的“正在调试已启用”测试从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在其中一个名单上发布了一段基准。
答案 2 :(得分:6)
因为String中的String是不可变的,所以左右String必须被复制到每个串联的新String中。所以,最好选择占位符。
答案 3 :(得分:3)
另一种选择是String.format()
。我们在jcabi-log(slf4j周围的静态实用程序包装器)中使用它。
Logger.debug(this, "some variable = %s", value);
它更易于维护和扩展。此外,它很容易翻译。