«Лямбда может быть заменена ссылкой на метод» в Lazy Logging с Log4J2 - PullRequest
2 голосов
/ 09 июля 2019

Я хочу сделать мою регистрацию более эффективной, используя отложенную регистрацию в Log4J2 .

Это означает, что я использую лямбды, которые выполняются только тогда, когда уровень журнала является правильным / выполненным.

Пример:

List<Integer> someList = Arrays.asList(1,2,3);
log.info("Size of list is {}.", () -> someList.size());

Моя IDE говорит мне, что я могу заменить эту запись на ссылку на метод следующим образом:

log.info("Size of list is {}.", someList::size);

Мой вопрос теперь таков: имеет ли этот подход (ссылка на метод) преимущество ленивого ведения журнала, т. Е. Что дорогостоящее вычислительное задание выполняется только при ведении журнала, когда уровень ведения журнала выполнен или выполнен Я теряю всю выгоду, когда я не использую лямбды явно?

1 Ответ

1 голос
/ 09 июля 2019

Взглянув на исходный код Log4j2, вы обнаружите, что класс Logger определяет Supplier<?>, чтобы сделать его ленивым, например. в одном из методов AbstractLogger.logIfEnabled() вы можете найти:

@Override
public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
            final Supplier<?>... paramSuppliers) {
        if (isEnabled(level, marker, message)) {
            logMessage(fqcn, level, marker, message, paramSuppliers);
        }
}

Supplier<?> будет вызываться только при включенном уровне, что делает его ленивым.

Не имеет значения, если вы предоставите Supplier, используя лямбду, ссылку на метод или написав new Supplier() { } анонимный класс. Вы можете взглянуть на Есть ли у лямбда-выражений какое-либо применение, кроме сохранения строк кода? вопрос, чтобы понять тонкие различия между этими подходами, но суть в том, что они будут ленивыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...