Java认证:从思路开始Java实现条件编译$ r+ x3 P! t+ T- A4 o" L1 ?5 f
从思路开始Java如何实现条件编译
2 E6 J" F1 Q6 H6 E6 n1 ~条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译。那么,在JAVA中,该如何实现条件编译呢?+ Q" n: P( _! c: b9 _) ^! Y
条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。代码如下:
1 T8 j3 s2 B: s#IFDEF DEBUG3 C! u; x+ X4 A, D) j
#UNDEF DEBUG. ]+ K; ~9 h7 m2 r- [
#ENDIF; F( V- E, p& z: f, K
#define DEBUG
9 C: \" H7 I" J#IFDEF DEBUUG
4 C8 d8 @% z6 K) Z/*
p$ c1 @& f( ocode block 18 d( [$ ~1 B$ J8 I- y4 G& \
*/
1 O! c8 b0 T. e#ELSE
% v- R) H+ F2 s8 G0 d4 N+ y/*
( l; U& b! r! D/ b3 Z$ {code block 2
9 }; ^1 e& _3 q6 h* m4 z: _*/
4 m4 E# o9 _2 c. V% r2 g#ENDIF
: _ |( K' n. s" n4 H' |但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译。那么,在JAVA中,该如何实现条件编译呢?& ^+ S0 F" m; r" l; q9 m- q
我们来看一个例子。& Y! s* k1 }- J1 h/ y
编写一个helloworld程序。代码如下:- m1 c1 k: y0 Q! I" a' h
public class Hello {1 u# N, o; @4 o" |
public static void main(String[] args) {
4 w5 S3 `2 s1 g! @System.out.println(“Hello, world!”);
% D: C" T+ R& a0 G+ B}) ~3 o" E- u, [
}
2 ]% D$ e: f# s' \+ c保存为Hello.java并编译,得到一个class文件,并且观察到文件大小是417字节。然后我们对这个文件进行反编译,用jd-gui。得到代码如下:
7 v0 L# c/ K1 \import java.io.PrintStream;
2 t; P3 ^( U) N9 J Vpublic class Hello
# k+ l- q, }- N2 Y{
\0 \ ?5 y/ Q/ Hpublic static void main(String[] paramArrayOfString)3 ?& @& e( P9 [! e' [3 }5 b
{) K/ ^) V: J# u
System.out.println(“Hello, world!”);
% A+ a0 G/ o6 s. w6 L) X}
/ q3 C- a" S1 r; Q. D* N4 s}6 Z. t; k' o* |
得到这个有什么用呢?
: _7 }+ d: I/ e+ d) g" V" v; _现在我们再来对源代码进行修改,修改后的代码如下。
" m( d9 |! b7 u8 mpublic class Hello {
& j! q0 L. j' E* m4 |/ ?5 |public static void main(String[] args) {
# q+ f$ a% f& t) t4 U) D2 xif(false) {- C. `+ Z' K* B( v, m/ E# W+ p. Y
System.out.println(“Hello, world!”);
4 B2 Z j! R/ L; t* w}5 L* T S9 b) T# b1 l
}
0 o ^. Y2 |! F2 j) v}
6 q0 l7 R" N2 _: h0 v. }- s! `
6 e2 [: p# }6 g5 b" L$ [! q( @
进行编译,这时我们再看它的大小,只有255字节。怎样?想到什么了吧?没错,编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。下面我们再来对该class文件进行反编译,果然代码如下:5 _" D5 `9 s" @+ k5 n* H8 p- S! E
public class Hello' d$ U3 ?0 H' o3 t. S8 I4 H
{/ U+ ?1 l: m% d' ^( g
public static void main(String[] paramArrayOfString)) l& {8 W; L3 t3 p8 ]- b6 e6 C
{0 T5 q. X6 H! X
}+ B& P5 O& ? {7 f* Z
}
5 {% {- G8 W& u( Z3 O3 h9 \* n利用JAVA编译的这一优化机制,我们就可以实现JAVA的条件编译了。
; {% c" i) [9 \# B1 Ppublic class Hello {
7 L0 S* P! G- e( M! qpublic static void main(String[] args) {* J" V. T; c' m+ Q6 p9 v
if(false) {
, V' h" D! y2 Q; ?! x ^System.out.println(“Hello, world!”);6 u4 [3 ]$ k* F4 R; p w
}
, O G( |( g+ |0 J1 {& {+ X: C* y}" h7 O5 |2 H6 Y5 q. ~
}" G/ B4 J) D4 ]( N) o
定义一个final的变量,然后再在if语句中使用。代码如下:' h" I/ i* ?2 c) O
public class Hello {0 ^5 [+ a: H1 g1 T5 J5 o( `
public static void main(String[] args) {/ ]5 ~$ D7 C8 I( X$ T- t( [
final boolean DEBUG = true;
0 D# I' _8 Y0 Z) @$ _1 dif(DEBUG) {! Q. S0 z) c/ g
System.out.println(“Hello, world!”);
5 c) _5 g* ?: B1 D! z, Q}# k/ `/ ?2 Z5 t, i# W* J
}
a4 K/ k( m; l7 V+ I2 g6 G}
! p" M' g- _/ O# _# ^4 Q当条件编译使用得多时,上面将极不利于代码的修改及维护,这时就可以用一种更为灵活的方法。定义一个静态类,里面专门定义用来控制条件编译的变量。然后再在具体的代码中导入该类,使用这些final变量。代码如下:
. u0 u% y! g" {: t3 Y3 upublic class DebugConfig {
9 E! U! e4 Q- V: j6 S1 Wpublic static final boolean BLUETOOTH_DEBUG = false;
9 m7 u4 |+ I# ^4 }2 vpublic static final boolean WIRELESS_DEBUG = false;
0 ~4 k; F, d6 Z$ K( L}* ^; S( t. a! `7 ?) v
if ( DebugConfig.BLUETOOTH_DEBUG) {$ S& a# i& {/ p7 u
// TODO
/ I$ g+ s, u% m5 E# b3 N} |