Сообщение не относится к стоимости конкатенации строк само по себе. Другие ответы абсолютно верны, когда говорят, что будет использоваться StringBuilder.
Основная причина использования шаблона сообщения заключается в том, что обработка выполняется только при отображении уровня ведения журнала!
Давайте используем эти два примера:
srcLogger.getLogger().log(Level.INFO,"UploadBean.doUpload completado [" + file.getName() + "]\n");
srcLogger.getLogger().log(Level.INFO, "UploadBean.doUpload completado [{0}]\n", file.getName());
При включенном уровне отладки INFO: Оба должны получить имя файла из файла, оба должны обновить строку, сгенерировать новую, отобразить ее.
При отключенном уровне отладки INFO: Второй ответ проходит через имя объекта File (это простой запрос), метод log () проверяет уровень INFO и немедленно возвращает результат. Нет String
обработка не выполняется вообще!
Теперь представьте, что вместо простого file.getName()
мы регистрировали более сложный объект, который сам требовал много конкатенации строк в методе toString()
. При непосредственном ведении этих объектов ни одна из этих обработок не выполняется вообще. toString()
никогда даже не вызывается, если не отображается уровень отладки.
Таким образом, шаблон сообщения не более эффективен в случае отображения журнала, но он значительно более эффективен (особенно в случаях нетривиального ведения журнала), когда ведение журнала не отображается. Одна из целей ведения журнала должна заключаться в том, что, если ведение журнала отключено, оно оказывает минимально возможное влияние на производительность системы.