下面是我的代码片段:
class A {
private boolean debug = false;
// Called when server boots up.
public void init (property) {
debug = property.getBoolean ("debug_var"); // read debug from a config file.
}
// some other function
public void foo () {
if (debug) {
System.out.println ("From inside the debug block");
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码时, if (debug) 实际上打印出“从内部调试块”如果 debug == true 在配置文件中。
两个问题:
那么,在这种情况下,编译器是否仅仅因为变量 debug 的值可能在运行时更改而在 .class 文件中包含 if 块?
如果这是真的,那么如何在某些环境中避免将某些代码添加到 .class 文件中?
如果你必须做这样的事情,大多数日志框架都有自己设置日志细节级别的方法,它们只是在运行时不输出任何级别太低的日志语句。使用日志框架正确执行此操作。
例如,使用内置的 java.util.logging 框架,您可以执行类似的操作
Logger.getLogger("ThisClass").log(Level.FINE, "Log message");
Run Code Online (Sandbox Code Playgroud)
只有在日志级别设置为 FINE 或更低时才会打印,但在日志级别为 CONFIG 或更低时被忽略。
“条件编译”通常在 Java 中没有意义,但是小心一点,JIT 会优化掉它可以确定永远不会执行的分支。