如何在java中实现宏

如何在java中实现宏,java,macros,Java,Macros,我需要能够打印在生产日志,但在发展我想打印到控制台。所以在C++中,我只需要使用宏,这将是1行的改变,我如何在java中实现呢? 谢谢只需定义一个静态方法并调用它。在该方法中,在调试时输入一个常量,该常量设置为true,并根据是否调试执行不同的代码。通常,编写一个函数,读取系统属性以知道打印到哪里 或者,对于这种特定情况,使用log4j,允许您在配置文件中指定类似的内容。查看或宏不是正确的答案,使用良好的日志框架是正确的。看看(或老的)。如果您将所有日志调用路由到这些外观中的一个,您将能够通过一

我需要能够打印在生产日志,但在发展我想打印到控制台。所以在C++中,我只需要使用宏,这将是1行的改变,我如何在java中实现呢?
谢谢

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

通常,编写一个函数,读取系统属性以知道打印到哪里


或者,对于这种特定情况,使用log4j,允许您在配置文件中指定类似的内容。

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

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++-ism在编译时让日志宏扩展为空那样高效,但是一个好的优化器/JIT应该能够注意到参数没有被使用,并优化设置这些参数的逻辑。

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

然而,日志记录是一种常见的需求,因此有几个选项可供选择。目前最好的方法是使用slf4j(因为{}构造允许良好的代码),并使用合适的后端。对于初学者来说,slf4j发行版中的“slf4j simple”后端很不错


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

我的答案有点晚了——4年了!:)

但是,对于记录,如果必须使用宏,在编译之前只需运行C++预处理器来完成java代码。当然,这假设你使用C++宏语法。 如果您不记得这是怎么回事,预处理器只会替换#define'd items


也就是说,我同意上面的说法——使用一个像样的框架(尽管我觉得在Java中没有宏有点傻)。

您是否有兴趣使用Java实现/使用日志记录,或者宏?Java没有宏,但有更动态的优势。这意味着在运行时,您可以在C++中有效地禁用一些必须在编译时禁用的内容。Java避免了编译多个版本的代码来打开和关闭各种选项的需要。它可以通过根据实际使用的方式优化代码来实现这一点。