条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译。那么,在JAVA中,该如何实现条件编译呢? 条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。代码如下:8 o* J" ~% W; m2 S; f, ^5 y. O% F o
#IFDEF DEBUG
7 K) ]; K7 U% h/ f' K. n) i' | #UNDEF DEBUG7 D- S1 H3 ~. s- y
#ENDIF% H$ }9 A& u) n2 |
#define DEBUG( O5 O1 B5 ]) f2 |) o7 d
#IFDEF DEBUUG
+ ]5 n8 N: a- P" G /*
1 \# c& Y8 L8 L& ?- N code block 1- u# ^8 y0 O; o
*/. ~" o& s% u! k2 Z3 W" o& D1 R; N
#ELSE
K! g% K$ v% n3 c# c /*
! K' J% q2 O9 ]' |( e4 f code block 2
5 ~2 `* {2 i4 L6 Q/ d1 z7 d R! ]8 { */
2 c" ]" R, M/ I! z- }1 x0 |* ^% r #ENDIF5 K$ M# b3 m1 A! O+ N
但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译。那么,在JAVA中,该如何实现条件编译呢?
/ H+ E: X2 g4 ^/ k5 m 我们来看一个例子。" s c$ F, ?, S, d# z
编写一个helloworld程序。代码如下:5 b; h L! e! Q0 t
public class Hello {
& R' S1 n2 B' @ public static void main(String[] args) {5 j: ?+ V7 o4 R4 w- V# Q5 z! f' Z
System.out.println("Hello, world!");4 D- z7 |5 y7 s$ Z
}
8 E8 ]. y. H% X4 R( C! |! |9 u- v }, G" B V D2 o9 h4 c. ^
保存为Hello.java并编译,得到一个class文件,并且观察到文件大小是417字节。然后我们对这个文件进行反编译,用jd-gui。得到代码如下:
, V; y p9 {4 P" i A2 b0 ?% r import java.io.PrintStream;, |- Z- q* M$ J: {
public class Hello
8 D7 i1 Q" y1 U& i8 | e8 _ {
6 H& z9 S2 K7 G0 c; _ public static void main(String[] paramArrayOfString)" } b; R5 l: j: c1 R- M1 o- _
{5 h/ w! W6 S) T" x/ ^. @
System.out.println("Hello, world!");
4 h1 @/ t+ H5 t3 Y }
0 K* _# k, G# f" S7 o8 N: S/ J7 h2 { }& U/ L3 H" d8 t, B2 P
得到这个有什么用呢?
$ Y z9 |( S$ D( H! D/ ` 现在我们再来对源代码进行修改,修改后的代码如下。$ s# L6 s" z" C, }) F+ J$ J
public class Hello {
2 @4 o8 t- c1 m! W7 `3 A. H public static void main(String[] args) {
4 j7 Q( |/ m4 ~7 e" R+ t if(false) {
5 l$ w! E+ w5 F System.out.println("Hello, world!");
# R8 s0 N+ B( m E- ` }
: O' z: `) _, T6 E0 {9 d6 u: c }+ [' ]4 z( ?- J& T1 d
}
. U4 `6 z( }. G6 R# o+ z 进行编译,这时我们再看它的大小,只有255字节。怎样?想到什么了吧?没错,编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。下面我们再来对该class文件进行反编译,果然代码如下:
( B' M# P. \+ J$ T/ h5 }/ U) Z public class Hello7 E3 e) Q$ T9 y
{6 w( {! v8 S* O2 [1 P( H) `
public static void main(String[] paramArrayOfString)/ m' K4 ?' k5 m- t# Y
{; ~$ u W W; V# w& c
}
& U1 O" S& F1 S4 R5 [- [ }0 a: L$ c- ?2 O! O) ]
利用JAVA编译的这一优化机制,我们就可以实现JAVA的条件编译了。* K6 }! ^* E% V4 |! B
public class Hello {5 U2 [% h) B0 I, D9 O
public static void main(String[] args) {
% j) q4 n* K: q$ j) B if(false) {
/ I L. d$ C) w8 C System.out.println("Hello, world!");
* ~! L) _! g% W, E }7 W. j# ^- a$ J" n
}
- @" a& c6 M4 S, G }/ `9 H. ^" Q$ n8 ], k
定义一个final的变量,然后再在if语句中使用。代码如下:
6 F2 B( V5 R' N6 V public class Hello {
7 v7 W9 r/ c* h% ]/ D8 z public static void main(String[] args) {* R& U- J$ \- t2 v8 W; @7 k
final boolean DEBUG = true;8 N: S- S7 \+ M6 L# I
if(DEBUG) {& r% E( m) @. x. a/ c
System.out.println("Hello, world!");
1 J9 X7 q5 ~# ~) B, h- n }
" [3 W' Q6 [. q: { }# h, h# W5 x( e7 w: b T# J
}
2 W- z2 u; e6 S- l 当条件编译使用得多时,上面将极不利于代码的修改及维护,这时就可以用一种更为灵活的方法。定义一个静态类,里面专门定义用来控制条件编译的变量。然后再在具体的代码中导入该类,使用这些final变量。代码如下:8 K; U5 V9 q' v% t0 {
public class DebugConfig {
. B' C, [& O# G5 }2 u- ]- M( e8 ~ public static final boolean BLUETOOTH_DEBUG = false;- M& w/ p+ J% ^# Y/ I
public static final boolean WIRELESS_DEBUG = false;
" i1 Y' c K, X6 D8 O0 F: f2 J }
* o9 m4 u+ Z& {& @8 G' _ if ( DebugConfig.BLUETOOTH_DEBUG) {
& ~& f8 F# W& W6 I7 j // TODO
. [ e- n! _2 N2 p# a9 L, h j } |