发布时不编译代码块?

时间:2014-08-23 13:19:05

标签: java eclipse

我有许多专门用于调试和帮助的行。有没有办法可以标记这些,这样它们在发布项目时不会编译,但在Eclipse中运行/调试我的程序时仍然可以使用?更好的方法是将某个字段标记为仅调试,并在发布时完全丢弃与该字段有关的所有内容。

我知道在使用这样的字段并在代码的关键部分使用它时,可能会遇到麻烦。但是我经常发现自己初始化了很多调试字段,然后将它们注释掉,如果我不对它们进行评论那么会导致错误。

那么有没有办法以更好,更有效的方式处理这个问题?

3 个答案:

答案 0 :(得分:3)

将代码放在if语句中,该语句引用另一个类中的final static boolean常量。像if这样的if (DEBUG)语句有效地表示if (false)(因为DEBUG为false)不是由Java编译器编译的。

public class Debug {
    public final static boolean DEBUG = true; // or false
}

public class X {
    public m() {
        if (Debug.DEBUG) {
             // Do some timing or displaying mouse positions, or whatever.
        }
    }
}

如果要验证这是否有效,可以使用javap反汇编程序:如果您的DEBUG常量为false,则编译器不会生成代码,但如果DEBUG为{{1}它会。

为了进一步参考,Java Language Specification(链接)有一个关于条件编译的部分,"例13.4.9-2"。这解释了我上面所描述的内容。

答案 1 :(得分:1)

使用您喜欢的记录器的跟踪级别,例如log4j的。

答案 2 :(得分:1)

是。使用日志框架。

存在一个日志框架,允许开发人员将重要事件写入标准命令行,文件或其他任何他们想要的地方。 Java带有内置(尽管是原始的)日志框架:java.util.logging

这是一个实际的样本。

Logger logger = Logger.getLogger("foo-logger");

logger.log(Level.INFO, "This is a log statement at a rather standard logging level - use when you want to log information out.");
logger.log(Level.WARNING, "This is a log statement at a rather moderate logging level - use when things warrant looking into but aren't mission critical.");
logger.log(Level.SEVERE, "This is a log statement at a rather high logging level - use when an (often irrecoverable) error has occurred.");

如果您使用它,那么您将在终端中看到类似的内容:

Aug 23, 2014 10:05:24 AM com.stackoverflow.sandbox.Formatting main
INFO: This is a log statement at a rather standard logging level - use when you want to log information out.
Aug 23, 2014 10:05:24 AM com.stackoverflow.sandbox.Formatting main
WARNING: This is a log statement at a rather moderate logging level - use when things warrant looking into but aren't mission critical.
Aug 23, 2014 10:05:24 AM com.stackoverflow.sandbox.Formatting main
SEVERE: This is a log statement at a rather high logging level - use when an (often irrecoverable) error has occurred.

其他框架(例如Log4J2)更直观地说明了这些级别的含义,并提供了更简单的选项来登出到您想要的任何位置。