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 }