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 }

 

你可能感兴趣的:(java)