Я думаю, что самая важная вещь, которую нужно здесь понять, это то, что макросовое решение C / C ++ не экономит вычислительные усилия , не создавая зарегистрированное сообщение, в случае, если уровень журнала был таким, что сообщениене быть зарегистрирован.Почему так?Просто потому, что метод макроса заставит препроцессор заменять каждое использование макроса:
LOG_IT(level, message)
с кодом:
if(level>=App.actLevel_) LOG_MSG(message);
Подставляя все, что вы передали как уровень , и все, что вы передали как сообщение вместе с макросомсам.Полученный код, который будет скомпилирован, будет точно таким же, как если бы вы скопировали и вставили макрос код в вашу программу.Единственное, в чем вам могут помочь макросы, - это избежать реального копирования и вставки, а также сделать код более читабельным и понятным.Иногда им удается это сделать, иногда они делают код более загадочным и, следовательно, его сложнее поддерживать в результате.В любом случае макросы не обеспечивают отложенного выполнения , чтобы избавить вас от фактического построения строки, как Класс Java8 Logger делает с помощью лямбда-выражений .Java откладывает выполнение тела лямбды до последнего возможного времени.Другими словами, тело лямбды выполняется после оператора if.Чтобы вернуться к своему примеру на C \ C ++, вы, как разработчик, вероятно, хотели бы, чтобы код работал независимо от уровня журнала, поэтому вам придется создать правильное строковое сообщение и передать его макросу.В противном случае на определенных уровнях журнала программа вылетит !Итак, поскольку код построения строки сообщения должен быть перед вызовом макроса, вы будете выполнять его каждый раз, независимо от уровня журнала.
Итак, чтобы сделать эквивалентный вашемукод довольно прост в Java 6!Вы просто используете встроенный класс: Logger .Этот класс поддерживает автоматическое ведение журнала уровней , поэтому вам не нужно создавать их собственную реализацию.Если вы спрашиваете, как реализовать отложенное выполнение без лямбды, я не думаю, что это возможно.
Если вы хотите сделать реальное отложенное выполнение в C \ C ++, вам придется создать код для регистрациинапример, чтобы получить указатель на функцию, возвращающую строку сообщения, вы должны заставить свой код выполнять функцию, переданную вам указателем функции в операторе if, и затем вы вызовете свой макрос, передавая не строку, а функцию, котораясоздает и возвращает строку!Я полагаю, что настоящий код C \ C ++, который делает это, выходит за рамки этого вопроса ... Ключевой концепцией здесь является то, что C \ C ++ предоставляет вам инструменты для отложенного выполнения просто потому, что они поддерживают указатели на функции.Java не поддерживает указатели функций, пока Java8 .