Нет, более короткая версия не создает строку "hello {} world {}
".Строка уже создана и помещена в пул констант во время компиляции и загрузки класса.Вы всегда ссылаетесь на один и тот же экземпляр из пула констант, это так же дешево, как и ссылка на константу int
.
Но строка - это , созданная в первой форме, так как вы используете конкатенацию строк.
Единственные дополнительные издержки - это вызов LOG.debug
с тремя аргументами, который ничего не делает, поскольку он вызывает isDebugEnabled()
внутри.Также есть вероятность, что он будет встроен.
При этом я скажу, что в 99% случаев я пойду на более короткую форму.Единственная ситуация, в которой я бы явно назвал isDebugEnabled
, - это когда вычисление сообщения для регистрации имеет значительную стоимость:
if(LOG.isDebugEnabled()){
LOG.debug("hello {} world {}", cheap, veryExpensive());
}
Если veryExpensive()
, ехем, очень дорого, то разумно избегатьназывая это, если это будет отброшено.КСТАТИ veryExpensive()
не должно иметь никаких побочных эффектов , и трудно представить длительный, без побочных эффектов метод ...