Java 中的条件编译:编译器会从类中省略“始终为假”的块吗?

FSP*_*FSP 3 java

下面是我的代码片段:

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 在配置文件中。

两个问题:

  1. 那么,在这种情况下,编译器是否仅仅因为变量 debug 的值可能在运行时更改而在 .class 文件中包含 if 块?

  2. 如果这是真的,那么如何在某些环境中避免将某些代码添加到 .class 文件中?

Lou*_*man 5

如果你必须做这样的事情,大多数日志框架都有自己设置日志细节级别的方法,它们只是在运行时不输出任何级别太低的日志语句。使用日志框架正确执行此操作。

例如,使用内置的 java.util.logging 框架,您可以执行类似的操作

Logger.getLogger("ThisClass").log(Level.FINE, "Log message");
Run Code Online (Sandbox Code Playgroud)

只有在日志级别设置为 FINE 或更低时才会打印,但在日志级别为 CONFIG 或更低时被忽略。

“条件编译”通常在 Java 中没有意义,但是小心一点,JIT 会优化掉它可以确定永远不会执行的分支。