Я часто вижу такие классические конструкции:
if (LOG.isLoggable(Level.FINER)) {
LOG.finer("The driver of the car is '"+ car.getDriver().getName() +"'.");
}
Если предположить, что у машины нет водителя, getDriver()
возвращает null
.
Реализация LOG.finer
может быть найдена здесь: http://developer.classpath.org/doc/java/util/logging/Logger-source.html#line.971
Тогда:
getName()
не может быть выполнена на null
, поэтомуNPE будет брошен.Только при особых обстоятельствах one : у меня должен быть регистратор на FINER
. LOG.isLoggable
должен выполняться дважды, 1-й до вызова метода .finer(
и внутри методаfiner
во второй раз. - В математическом операторе создается StringBuilder
+
. - Я должен импортировать класс
Level
. - Другой поток можетустановите для драйвера значение
null
и запретите журналу регистрировать эту строку.
Что, если я вместо этого использую Lambdas?
Пример:
LOG.finer(()->"The driver of the car is '", ()->car.getDriver().getName(), ()->"'.");
Wheratfiner
определяется как
public void finer(ObjectReturningFunctionalInterface ... arguments) {
Мы можем решить все недостатки, которые мы видим в классическом стиле, если перехватим все исключения при оценке аргументов.
Почему это плохая идея?