как реализовать макросы в Java - PullRequest
5 голосов
/ 20 марта 2011

Мне нужно иметь возможность печатать на производстве в регистраторе, но во время разработки я хотел бы печатать на консоли. Так что в C ++ я просто использовал бы макрос для этого, и это было бы изменение на 1 строку, как я могу сделать это в Java? Спасибо

Ответы [ 7 ]

9 голосов
/ 20 марта 2011

Макросы не являются правильным ответом, если использовать хорошую структуру ведения журналов.Посмотрите на SLF4J (или более старый log4j ).Если вы перенаправите все свои входящие звонки через один из этих фасадов, вы сможете отправлять свои записанные сообщения на консоль, или в файл, или любому другому приложению, которое вам нравится с небольшим количеством настроек.

4 голосов
/ 20 марта 2011

Java не имеет C / C ++ - как макросы, и поэтому нет простого способа автоматически отключить весь ваш код регистрации. Что вы можете сделать, это что-то вроде этого:

public class Utility {
    private Utility() {} // Singleton

    public static void log(String toLog) {
        System.out.println(toLog);
    }
    /* ... etc. ... */
}

Теперь в любой точке вашей программы, в которую вы хотите записать событие, вы можете просто позвонить

Utility.log("Here's a message!");

В производственных сборках вы можете отключить вывод, просто изменив реализацию log на no-op.

Это не так эффективно, как в C / C ++ - просто расширять ваш макрос регистрации до нуля во время компиляции, но хороший оптимизатор / JIT должен быть в состоянии заметить, что аргумент не используется, и оптимизировать Откажитесь от логики, чтобы установить эти аргументы.

3 голосов
/ 20 марта 2011
2 голосов
/ 20 марта 2011

Просто определите статический метод и вызовите его. В этом методе установите константу, которая установлена ​​на true при отладке, и выполняйте другой код в зависимости от того, отлаживаетесь вы или нет.

1 голос
/ 20 марта 2011

Java напрямую не поддерживает препроцессор и, следовательно, не поддерживает макросы.

Ведение журнала, однако, является общей потребностью, поэтому есть несколько вариантов на выбор.На данный момент наилучшим подходом является использование slf4j (так как конструкции {} допускают хороший код) с подходящим бэкэндом.Для начала неплохо использовать "slf4j-simple" бэкэнд в дистрибутиве slf4j.

Обратите внимание, что автор slf4j настоятельно поддерживает бэкэнд logback.Пока вам это не нужно.

1 голос
/ 20 марта 2011

В общем, напишите функцию, которая читает системное свойство, чтобы знать, куда печатать.

Или, для этого конкретного случая, используйте log4j, который позволяет вам указывать такие вещи в конфигурационном файле.

0 голосов
/ 13 мая 2015

Мой ответ немного запоздал - 4 года! :)

Но для справки: если вы должны использовать макросы, просто запустите препроцессор C ++ над кодом Java перед компиляцией. Конечно, это предполагает, что вы используете макрос синтаксиса C ++.

Если вы не помните, что это делает, препроцессор просто заменяет элементы # define'd ...

Тем не менее, я согласен с вышеизложенным - используйте приличный фреймворк (хотя ИМХО немного глупо не иметь макросов в Java).

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