如何在java中实现宏

时间:2011-03-20 09:55:12

标签: java macros

我需要能够在生产中打印到记录器,但在开发时我想打印到控制台。所以在c ++中我会简单地使用一个宏,这将是1行的变化,我怎么能在java中做到这一点? 感谢

7 个答案:

答案 0 :(得分:9)

使用良好的日志框架,宏不是正确的答案。查看SLF4J(或更早的log4j)。如果您通过其中一个外观路由所有日志记录调用,您将能够通过一点点配置将记录的消息发送到控制台,文件或任何其他您喜欢的appender。

答案 1 :(得分:4)

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的实现更改为无操作即可使此输出静音。

这不如C / C ++那么高效 - 只是让您的日志记录宏在编译时扩展到虚无,但是一个好的优化器/ JIT应该能够注意到该参数没有被使用和优化远离建立这些论点的逻辑。

答案 2 :(得分:3)

答案 3 :(得分:2)

只需定义一个静态方法并调用它。在该方法中,设置一个常量,在调试时设置为true,并根据您是否正在调试执行不同的代码。

答案 4 :(得分:1)

通常,编写一个函数来读取系统属性以了解要打印到的位置。

或者,对于这种特定情况,使用log4j,它允许您在配置文件中指定这样的东西。

答案 5 :(得分:1)

Java不直接支持预处理器,因此不支持宏。

然而,记录是一种常见需求,因此有多种选择可供选择。目前,最好的方法是使用slf4j(因为{} -constructs允许良好的代码),并使用合适的后端。首先,slf4j发行版中的“slf4j-simple”后端很不错。

请注意,slf4j作者强烈支持logback后端。现在,你不需要那个。

答案 6 :(得分:0)

我的回答有点晚了 - 4年! :)

但仅仅是为了记录,如果你必须使用宏,那么在编译之前只需要在Java代码上运行C ++预处理器。当然,这假设您使用C ++宏语法。

如果你不记得它的作用,那么预处理器就会替换#defined'd items ...

那表示我同意上述内容 - 使用一个像样的框架(虽然恕我直言,但是在Java中使用宏并不是一件愚蠢的事情。)