Выбор ответа Senior String и пул строк обновлено

Логирование и конкатенация

Вопрос

Почему в коде с SLF4J пишут log.debug("user {} loaded {} items", id, n), а не log.debug("user " + id + " loaded " + n + " items")?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Плейсхолдеры не собирают строку при выключенном DEBUG, а + всегда. Аргументы метода вычисляются до вызова, поэтому конкатенация создаёт строку даже тогда, когда сообщение отбросят.

Варианты ответа

  1. Конкатенация не работает с числами и вызывает toString с ошибкой
  2. Плейсхолдеры не собирают строку при выключенном DEBUG, а + всегдаправильный ответ
  3. Плейсхолдеры защищают логи от SQL-инъекций в значениях аргументов
  4. Так итоговая строка попадает в пул строк и переиспользуется

Разбор

Аргументы метода вычисляются до вызова, поэтому конкатенация создаёт строку даже тогда, когда сообщение отбросят. SLF4J подставляет аргументы только при включённом уровне. Если сам аргумент дорогой (toJson(obj)), его всё равно вычислят, тут помогает isDebugEnabled() или ленивые варианты API. Числа конкатенируются нормально, к инъекциям и пулу строк это отношения не имеет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме