新浪微博 Github

Java知识点:条件编译

条件编译

一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile)。                                    ---百度百科

具体应用场景

  • 实现一个在 Linux和Windows上使用的程序,当程序在Linux上运行时,运行某一段代码,当程序在Windows上运行时,运行另一段代码。
  • 实现一个区分 Debug 和 Release 模式的程序,即当程序用于Debug时,运行某一段代码,当程序用于 Release时,运行另一段代码。

Java编译器优化法则

(1)如果if的条件是false,则在编译时忽略这个if语句。

(2)忽略未使用的变量。

下面举一个例子来证明上面的观点。

 1 public class ConditionalCompilation01
 2 {
 3     public static void main(String[] args) {
 4         final boolean flag = false;
 5         int a = 1;
 6         if(flag)
 7         {
 8             System.out.println("hello");
 9         }
10     }
11 }

生成class文件后,用jad反编译后结果如下:

 1 public class ConditionalCompilation01
 2 {
 3 
 4     public ConditionalCompilation01()
 5     {
 6     }
 7 
 8     public static void main(String args[])
 9     {
10     }
11 }

其中 a 是未使用的变量,而因为flag是final的,且为false,因此编译器也将其忽略。

条件编译应用

场景:实现一个区分DEBUG和RELEASE模式的程序。

通常为了让Java条件编译更加方便,我们创建一个类:CompilationConfig。

1 class CompilationConfig
2 {
3     static final boolean DEBUG_MODE = true;
4     static final boolean RELEASE_MODE = false;
5 }

从上面可以看出,这个类有如下特点:

  • 全部都是static final boolean常量。
  • 如果是debug模式,则DEBUG_MODE=true;
  • 如果是release模式,则RELEASE_MODE=true;
 1 public class ConditionalCompilation02
 2 {
 3     public static void main(String[] args) {
 4         if(CompilationConfig.DEBUG_MODE)
 5         {
 6             System.out.println("[DEBUG MODE]You can print sth");
 7         }
 8         else
 9         {
10             System.out.println("[RELEASE MODE]You can print sth");
11         }
12     }
13 }

如果DEBUG_MODE=true,则class文件编译后,用jad反编译为如下代码:

 1 import java.io.PrintStream;
 2 
 3 public class ConditionalCompilation02
 4 {
 5 
 6     public ConditionalCompilation02()
 7     {
 8     }
 9 
10     public static void main(String args[])
11     {
12         boolean flag = true;
13         System.out.println("[DEBUG MODE]You can print sth");
14     }
15 }

 

posted @ 2013-08-02 18:24  xiazdong  阅读(1977)  评论(2编辑  收藏  举报