Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串参数化-间接toString方法的性能损失_Java_Performance_String Concatenation - Fatal编程技术网

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);