如何使方法参数评估变得懒惰?

Har*_*hit 3 java

我的代码中有一个调试日志语句,我将代价高昂的方法调用结果传递给它。

log.debug("Data - {}", obj.costlyMethodCall());
Run Code Online (Sandbox Code Playgroud)

现在,即使调试日志被禁用,obj.costlyMethodCall()也将始终被评估为作为方法参数传递。

缓解这种情况的一种方法是明确检查是否启用了调试日志记录

if (log.isDebugEnabled()) {
  log.debug("Data - {}", obj.costlyMethodCall());
}
Run Code Online (Sandbox Code Playgroud)

但这会降低代码的可读性。

有没有更好的方法可以在这里懒惰或有条件地调用obj.costlyMethodCall()

Smu*_*tje 5

通常这是通过让方法接受类似于 aSupplier而不是具体的东西来解决的,Object这样你就可以传入类似的东西

log.debug("Data - {}", () -> obj.costlyMethodCall());
Run Code Online (Sandbox Code Playgroud)

哪里log.debug

public void debug(String message, Supplier<Object> supplier) {
    Object value = supplier.get(); // costlyMethodCall is only called here
    // ...
}
Run Code Online (Sandbox Code Playgroud)