我的代码中有一个调试日志语句,我将代价高昂的方法调用结果传递给它。
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()?
通常这是通过让方法接受类似于 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)
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |