我从 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 向我展示了一个黄色灯泡并说:
记录器中字符串连接的使用效率低下
所以我点击了
"Convert string concatenation to a message template"
,它将代码更改为:
_logger.log(Level.INFO, "[{0}] v{1} enabled", new Object[]{car, dog});
这会导致问题。因为在日志中我看到:
[{0}] v{1} enabled
。
如何解决?
您有几个选择
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)忽略警告,因为效率与此无关。如果你真的关心速度,你就不会记录东西。日志记录需要很长的时间,并且字符串格式化和字符串追加之间的差异相对于写入日志所花费的时间来说非常小。
这只是来自 Netbeans 的帮助建议,实际上是代码
_logger.info(car + " text " + dog); // on this line Netbeans
_logger.log(Level.INFO, "{0} text {1}", new Object[]{car, dog});
产生相同的输出。第一个变体对编码人员更友好,输入调试消息的时间更少,第二个变体很棒。
在确定是否应写入消息之前生成去参数化字符串的任何方法都是低效的。 您可能写得不好
java.util.logging.Formatter
。我的意思是一个格式化程序,它只是输出
LogRecord.getMessage()
而不是合并
LogRecord.getParameters()
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();
}
}
如果您不想,可以禁用提示。提示也可以配置。