我经常看到这样的经典构造:
if (LOG.isLoggable(Level.FINER)) {
LOG.finer("The driver of the car is '"+ car.getDriver().getName() +"'.");
}
假设汽车没有驾驶员,
getDriver()
返回null
。LOG.finer
的实现可以在这里找到:http://developer.classpath.org/doc/java/util/logging/Logger-source.html#line.971然后:
getName()
不能在null
上执行,因此将引发NPE。仅在一种特殊情况下:我必须将记录器放在FINER
上。LOG.isLoggable
必须执行两次,第一次在.finer(
方法调用之前执行,第二次在方法finer
内部执行。在数学运算符
+
上创建一个StringBuilder。我必须导入类
Level
。其他线程可能会将驱动程序设置为
null
,并阻止日志记录此行。如果我改用Lambdas怎么办?
例:
LOG.finer(()->"The driver of the car is '", ()->car.getDriver().getName(), ()->"'.");
Wherat
finer
定义为public void finer(ObjectReturningFunctionalInterface ... arguments) {
如果捕获所有参数评估异常,则可以解决经典样式中的所有弊端。
为什么这是个坏主意?
最佳答案
嗯,
因为lambdas
可以在不同的Thread
中执行。因此,此处的变量car
必须为final
。
关于java - 为什么使用Lambda记录更好的硬事实,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54875763/