通过final变量实现条件编译

简介:

首先来比较两段代码所产生的中间代码:

 public class AppConfig {

     public   static   final   boolean  debug  =   true ;
}
public   class  DebugCode {
    
public   static   void  main(String[] args) {
       
if (AppConfig.debug) {
           System.out.println(
" Some debug information " );
       }
    }
}

DebugCode的中间代码(部分):

public class org.levin.insidejvm.miscs.DebugCode {

 public static void main(java.lang.String[] args);

    0 getstatic java.lang.System.out : java.io.PrintStream [16]

    3 ldc <String "Some debug information"> [22]

    5 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]

    8 return

}

 

public   class  AppConfig {
    
public   static   final   boolean  debug  =   false ;
}
public   class  ReleaseCode {
    
public   static   void  main(String[] args) {
       
if (AppConfig.debug) {
           System.out.println(
" Some debug information " );
       }
    }
}

 

 

ReleaseCode中间代码(部分):

public class org.levin.insidejvm.miscs.ReleaseCode {

 public static void main(java.lang.String[] args);

    0 return

}

 

在上面的代码中,很明显DebugCodeReleaseCode中的代码是一样的,只是AppConfig.debug的值不一样而已,却产生了不同的中间代码,即编译器在AppConfig.debugfalse的时候直接忽略了if中的语句。利用这个特性,我们就可以根据配置来实现条件编译,从而实现不同的条件产生不同的中间代码而不只是不同的运行结果。

 

然而在这里为什么会出现这样的行为呢?

这是因为编译器对final修饰的基本类型和String类型的变量,在编译时解析为一个本地拷贝,这样拷贝导致编译器在编译的时候明确的知道ReleaseCode的那一段if语句是不会被执行的,因而可以对其做优化。而这种替换的结果也使得用final修饰的int变量可以出现在switch-case语句中。

 

这种方式的缺陷

这种方式的缺陷在于要现实该机制的条件编译,在改变AppConfig.debug中的值时,需要同时对AppConfig类和ReleaseCode类进行编译(即不能只编译AppConfig类)。


相关文章
|
7月前
final修饰的变量有三种
final修饰的变量有三种
74 0
|
7月前
|
编译器 C++
CPP的常量引用
CPP的常量引用
54 0
|
4月前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
6月前
|
Dart 编译器
Dart基础-main及变量、常量、注释
Dart基础-main及变量、常量、注释
|
7月前
|
编译器 C++
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
|
7月前
|
编译器
关键字static#define 定义常量和宏
关键字static#define 定义常量和宏
41 0
|
编译器 C语言 C++
const修饰的究竟是常量还是变量?
const修饰的究竟是常量还是变量?
94 0
|
7月前
|
存储 C语言
变量和常量的例子
变量和常量的例子
45 1
|
7月前
|
编译器 C++
C++:编译器对被const修饰变量的处理行为(替换)
C++:编译器对被const修饰变量的处理行为(替换)
41 0
|
存储 编译器 C语言
【C语言】关键字static——static修饰局部变量、全局变量和函数详解!
【C语言】关键字static——static修饰局部变量、全局变量和函数详解!
341 0