条件编译绝对是一个好东西如在C或CPP中可以通过预处理语句来实现条件编译代码如下
#IFDEF DEBUG
#UNDEF DEBUG
#ENDIF
#define DEBUG
#IFDEF DEBUUG
/*
code block
*/
#ELSE
/*
code block
*/
#ENDIF
但是在JAVA中却没有预处理宏定义这些东西而有时在一些项目中我们又需要条件编译那么在JAVA中该如何实现条件编译呢?
我们来看一个例子
编写一个helloworld程序代码如下
public class Hello {
public static void main(String[] args) {
Systemoutprintln(Hello world!);
}
}
保存为Hellojava并编译得到一个class文件并且观察到文件大小是字节然后我们对这个文件进行反编译用jdgui得到代码如下
import javaioPrintStream;
public class Hello
{
public static void main(String[] paramArrayOfString)
{
Systemoutprintln(Hello world!);
}
}
得到这个有什么用呢?
现在我们再来对源代码进行修改修改后的代码如下
public class Hello {
public static void main(String[] args) {
if(false) {
Systemoutprintln(Hello world!);
}
}
}
进行编译这时我们再看它的大小只有字节怎样?想到什么了吧?没错编译器会对代码进行优化对于条件永远为false的语句JAVA编译器将不会对其生成字节码下面我们再来对该class文件进行反编译果然代码如下
public class Hello
{
public static void main(String[] paramArrayOfString)
{
}
}
利用JAVA编译的这一优化机制我们就可以实现JAVA的条件编译了
public class Hello {
public static void main(String[] args) {
if(false) {
Systemoutprintln(Hello world!);
}
}
}
定义一个final的变量然后再在if语句中使用代码如下
public class Hello {
public static void main(String[] args) {
final boolean DEBUG = true;
if(DEBUG) {
Systemoutprintln(Hello world!);
}
}
}
当条件编译使用得多时上面将极不利于代码的修改及维护这时就可以用一种更为灵活的方法定义一个静态类里面专门定义用来控制条件编译的变量然后再在具体的代码中导入该类使用这些final变量代码如下
public class DebugConfig {
public static final boolean BLUETOOTH_DEBUG = false;
public static final boolean WIRELESS_DEBUG = false;
}
if ( DebugConfigBLUETOOTH_DEBUG) {
// TODO
}