我有许多专门用于调试和帮助的行。有没有办法可以标记这些,这样它们在发布项目时不会编译,但在Eclipse中运行/调试我的程序时仍然可以使用?更好的方法是将某个字段标记为仅调试,并在发布时完全丢弃与该字段有关的所有内容。
我知道在使用这样的字段并在代码的关键部分使用它时,可能会遇到麻烦。但是我经常发现自己初始化了很多调试字段,然后将它们注释掉,如果我不对它们进行评论那么会导致错误。
那么有没有办法以更好,更有效的方式处理这个问题?
答案 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)更直观地说明了这些级别的含义,并提供了更简单的选项来登出到您想要的任何位置。