Как известно
LOGGER.debug("The parameter p1 cannot be " + p1 +
", it must be between " + P1_MIN + " and " + P1_MAX);
Имеет недостаток, заключающийся в том, что конкатенация строк выполняется, даже если результат будет отброшен из-за настроек регистратора. Чтобы избежать этого, популярен следующий шаблон
if (LOGGER.isDebugEnabled())
{
LOGGER.debug("The parameter p1 cannot be " + p1 +
", it must be between " + P1_MIN + " and " + P1_MAX);
}
Что позволяет избежать этого за счет трех дополнительных строк.
slf4j
(и другие) предлагают альтернатива с использованием varargs
(и overloading
):
LOGGER.debug("The parameter p1 cannot be {} , it must be between {} and {}",
p1, P1_MIN, P1_MAX);
Это выглядит намного чище, но создается Object array
для передачи переменного числа параметров.
Насколько дорого обходится создание этого массива объектов? Перевешивает ли его стоимость преимущества сокращения количества строк кода?
Я подозреваю, что методы, основанные на varargs/formatter
, созданы именно для решения вышеуказанного шаблона, поэтому даже если несколько субъективные ответы экспертов помогут огромному количеству программистов. Кроме того, IMHO, это не субъективно, если создание массива объектов очень дешево (на что я надеюсь) или очень дорого.
Object[]
Альтернативаslf4j
также внутренне должна будет проанализировать строку формата, создать объект форматирования и построить отформатированную строку. Мне не ясно, почему вы ожидаете, что это будет дешевле, чем просто проверка, включена ли отладка в регистраторе. - person QuantumMechanic   schedule 10.05.2012varargs
очень дорого. Я правильно это читаю? - person Miserable Variable   schedule 10.05.2012void debug(String format, Object[] argArray)
и читалvoid debug(String format, Object... argArray)
. - person Miserable Variable   schedule 11.05.2012