6

我从java开始,我尝试记录一些东西。

private static final Logger _logger = Logger.getLogger("my"); 

String car = "bmw";
String dog = "dog"; 

_logger.info(car + " text " + dog); // on this line Netbeans

.. 在这条线上,Netbeans 向我展示了黄色灯泡并说:在记录器中使用字符串连接效率低下

所以我点击“将字符串连接转换为消息模板”并将代码更改为:

_logger.log(Level.INFO, "[{0}] v{1} enabled", new Object[]{car, dog});

这导致问题。因为在日志中我看到:[{0}] v{1} enabled 如何修复它?

4

4 回答 4

9

你有几个选择

1)使用 String.format() _logger.log(Level.INFO, String.format("[%s] %s enabled", car, dog))

2) 使用StringBuilder.append()或 String.concat()`。

前任:_logger.log(Level.INFO, new StrinBuilder(car).append(" text ").append(dog));

这本质上就是 javac 在优化中所做的。

3)忽略警告,因为效率与此无关。如果你真的关心速度,你就不会记录东西。记录需要很长时间,相对于写入日志所花费的时间,字符串格式化和字符串附加之间的差异非常小。

于 2012-09-07T18:36:18.197 回答
1

它只是帮助 Netbeans 的建议,实际上是代码

_logger.info(car + " text " + dog); // on this line Netbeans
_logger.log(Level.INFO, "{0} text {1}", new Object[]{car, dog});

产生相同的输出。第一个变体对编码器更友好,输入调试消息的时间更少,第二个很棒。

于 2012-09-07T18:50:25.167 回答
1

在确定是否应该写入消息之前生成去参数化字符串的任何方法都是低效的。

你可能写得不好java.util.logging.FormatterLogRecord.getMessage()我的意思是一个简单输出而不是合并的格式化程序LogRecord.getParameters()

于 2012-09-07T18:56:54.533 回答
0

这是netbeans 7.1.2做的实际格式化

public class Vels4j {

    private static final Logger _logger = Logger.getLogger("my");
    String car = "bmw";
    String dog = "dog";

    Vels4j() {
       // _logger.info(car + " text " + dog);
        _logger.log(Level.INFO, "{0} text {1}", new Object[]{car, dog});
    }

    public static void main(String[] args) {
        Vels4j vels4j = new Vels4j(); 
    }
}

如果您不想要,您可以禁用提示。提示也可以配置。

于 2012-09-07T18:52:51.650 回答