Есть ли преимущество использования {}
вместо конкатенации строк?
Пример из slf4j
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
вместо того
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
Я думаю, это об оптимизации скорости, потому что оценки параметров (и конкатенации строк) можно избежать во время выполнения в зависимости от файла конфигурации. Но возможны только два параметра, тогда иногда нет другого выбора, кроме конкатенации строк. Нужны мнения по этому поводу.
Краткая версия: да, это быстрее, с меньшим количеством кода!
Конкатенация строк выполняет много работы, не зная, нужна она или нет (традиционный тест «включена отладка», известный из log4j), и его следует по возможности избегать, поскольку {} позволяет отложить вызов toString () и построение строки. до после того, как было решено, нужно событие или нет. На мой взгляд, благодаря формату регистратора в виде одной строки код становится чище.
Вы можете указать любое количество аргументов. Обратите внимание, что если вы используете старую версию sljf4j и у вас более двух аргументов
{}
, вы должныnew Object[]{a,b,c,d}
вместо этого использовать синтаксис для передачи массива. См., Например, http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object []) .Что касается скорости: некоторое время назад Ceki разместил тест в одном из списков.
источник
debug(String format, Object... arguments)
. См. Slf4j.org/faq.html#logging_performanceПоскольку String неизменяема в Java, левую и правую String необходимо скопировать в новую строку для каждой пары конкатенации. Итак, лучше выбрать заполнитель.
источник
Другая альтернатива есть
String.format()
. Мы используем его в jcabi-log (статическая служебная оболочка вокруг slf4j).Это намного удобнее в обслуживании и расширении. Кроме того, это легко перевести.
источник
value
изменится, вам нужно будет вернуться и также изменить оператор журнала. То, с чем вам не помогут IDE. Регистраторы должны помогать с отладкой, а не мешать ей. :-)String.format("%d", "Test")
выдает предупреждение IntelliJArgument type 'String' does not match the type of the format specifier '%d'.
. Хотя я не уверен, что он по-прежнему сможет обеспечить такой разумный ответ при работе с вышеуказанным решением.Я думаю, с точки зрения автора, основная причина - уменьшить накладные расходы на конкатенацию строк. Я только что прочитал документацию к регистратору, вы могли найти следующие слова:
источник