我经常看到这样的经典构造:

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/

10-11 00:34