Java字符串参数化-间接toString方法的性能损失
我有一个Java字符串参数化-间接toString方法的性能损失,java,performance,string-concatenation,Java,Performance,String Concatenation,我有一个方法如下: private String getOrderListAsString() { StringBuilder str = new StringBuilder(); str.append("Sell list:"); for (Order o : sellOrderList) { str.append("\nSale: ").append(o); } str.append("Buy list:"); for (Ord
方法
如下:
private String getOrderListAsString() {
StringBuilder str = new StringBuilder();
str.append("Sell list:");
for (Order o : sellOrderList) {
str.append("\nSale: ").append(o);
}
str.append("Buy list:");
for (Order o : buyOrderList) {
str.append("\nBuy: ").append(o);
}
return str.toString();
}
它通过日志参数化调用,如下所示:
我们正在使用作为记录器
问题是,即使记录器级别为level.OFF
为了解决这个问题,我们在方法的开头添加了一个
if
语句:
// Declaration:
boolean shouldLog = DebugWriter.getInstance().getLogger().getLevel() != Level.OFF;
// Usage in function:
if(!shouldLog) return null;
但感觉这可以用一种更聪明的方式来实现。提前谢谢 的重载采用供应商
,但不与格式字符串组合。所以你可以这样使用它:
logger.info(() -> getOrderListAsString());
或者创建一个具有
toString()
方法的新抽象OrderList
。然后,您可以简单地将其作为参数传递,如果需要,记录器将调用toString()
。与Eran的答案相同,但只是包装参数,而不是更改日志实现
public class LazyToString
{
private final Supplier<String> stringSupplier;
public LazyToString(Supplier<String> stringSupplier)
{
this.stringSupplier = stringSupplier;
}
@Override
public String toString()
{
return stringSupplier.get();
}
}
如果这太冗长,您可以创建一个静态方法调用来创建对象,而不是使用new,可能看起来像这样
log.info("Something happened {}", lazy(this::getOrderListAsString));
如果您使用的是Java 8+,那么Java.util.Logger有一个重载的
log
方法,该方法接受供应商
public void log(Level level,
Supplier<String> msgSupplier)
或者,使用方法引用
logger.log(Level.INFO, this::getOrderListAsString);
整个项目在我的控制范围内。理论上,我可以改变任何东西编写代码的方式,方法
getOrderListAsString()
将始终被调用,而不管日志级别如何。在生成日志消息之前,您需要检查日志级别。唯一的缺点是,我不能将“{0}”
符号与itLooks结合使用。我一定会保存它!现在我将使用@user7的答案,因为它更小,并且我不需要{}
解析。但当我这样做的时候,我可能不得不换成这个。谢谢你回答所有的问题,还有之前的问题!
public void log(Level level,
Supplier<String> msgSupplier)
logger.log(Level.INFO, () -> getOrderListAsString());
logger.log(Level.INFO, this::getOrderListAsString);