a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 141|回复: 0

[基础知识] 从思路开始Java如何实现条件编译

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
条件编译绝对是一个好东西。如在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    }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 03:11 , Processed in 0.771924 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表