a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 599|回复: 0

[专业语言] Java认证:从思路开始Java实现条件编译

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证:从思路开始Java实现条件编译" `8 H9 c, c3 {2 E% c0 j6 a
从思路开始Java如何实现条件编译8 x' a; i# D/ V# D6 A
条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译。那么,在JAVA中,该如何实现条件编译呢?* I4 q0 M% [4 ]% Z$ m
条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。代码如下:
' u7 u) F. k2 ?! b#IFDEF DEBUG
2 b" K4 i' g; M#UNDEF DEBUG7 u4 s% w# U0 Z/ Q6 n) i8 b. ?. c
#ENDIF3 ~& U6 ~. y, b% G
#define DEBUG' @; A  M* y% T
#IFDEF DEBUUG* D4 A9 Y- b$ G
/*
9 _  |% c% p7 J" \: {/ \code block 1: b& i; `' G0 v% v
*/
/ ?5 `6 f/ v' V1 y/ ^6 R#ELSE, o( L0 l& l* P+ S4 a4 ]$ M7 v' m+ S" w
/*
0 c% C) p; y% Q9 M' [& ]* ]code block 2$ J- `1 R" Y. D+ r& G& [
*/, V2 f, z. y1 p8 `
#ENDIF
7 _1 D" F5 [7 {但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译。那么,在JAVA中,该如何实现条件编译呢?
8 p6 e% M9 h/ i. Z" C. N我们来看一个例子。. e$ I# i. [) i$ J4 E6 w
编写一个helloworld程序。代码如下:# P  Z4 B0 X# ]+ H5 r9 X: N
public class Hello {, M& Y$ Q& v' O& _# g' D
public static void main(String[] args) {! b9 X1 n" E) g. P0 _  |: I8 m$ Q
System.out.println(“Hello, world!”);1 s7 f! e# N5 p$ M; _! F( b
}: \  D! ~! j6 R3 g! V1 v7 B8 {
}
+ i; u) _, z! T" _8 `保存为Hello.java并编译,得到一个class文件,并且观察到文件大小是417字节。然后我们对这个文件进行反编译,用jd-gui。得到代码如下:3 b1 H  H" P+ T0 i8 L
import java.io.PrintStream;
9 C. H' O6 z" T; x2 Zpublic class Hello4 f) c+ ^. o; @5 O$ R
{
" I4 K* U: X4 r* d/ V5 Bpublic static void main(String[] paramArrayOfString)
" i0 z! q8 I7 n{- R8 S4 T  t( n6 J
System.out.println(“Hello, world!”);+ F6 Q. S' G: i# |, L0 H
}3 B; C; J9 X7 f6 V7 L5 J
}% l5 E9 g+ \1 n* {6 K1 J" x8 I8 N- t+ |
得到这个有什么用呢?. B4 Q; S2 ?  _
现在我们再来对源代码进行修改,修改后的代码如下。
4 g! @0 J/ ^; M  u) Opublic class Hello {3 X# }6 w0 ]! K! p4 X
public static void main(String[] args) {
9 I# ~: Q1 l$ r9 tif(false) {" z0 R, C0 n! M& X. `( @/ {0 T, t
System.out.println(“Hello, world!”);
% z! w( A- n: J% X: R}
8 i/ B: w: b8 B: n}
# k0 T4 P0 u) _& w( r- _}: Y; `6 W7 h* \9 ~
. s' W, r; r* a; {$ N9 }+ R+ w! I
4 ]( N0 ^+ g# j
进行编译,这时我们再看它的大小,只有255字节。怎样?想到什么了吧?没错,编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。下面我们再来对该class文件进行反编译,果然代码如下:& B8 t" r; \! T- S! P4 Y4 ~  Z2 y
public class Hello. g' p5 {; |8 P. r
{
  B9 }$ M2 E( \1 opublic static void main(String[] paramArrayOfString)
- E+ A. ^0 I+ J{
0 G" C/ m# d/ J. a}$ ^6 R  W1 W( h9 Z3 q6 u& O
}% m. g- U6 T! P9 \& }+ c. j' \) _
利用JAVA编译的这一优化机制,我们就可以实现JAVA的条件编译了。
4 R7 E# }2 Q5 M) o! F' v( a2 Bpublic class Hello {
9 d7 I% H& P: ?& m# zpublic static void main(String[] args) {
* U7 \: V# [  o: [) R# \if(false) {
1 i  ]: h8 @+ p- a0 q% _System.out.println(“Hello, world!”);
) g* D- H4 `4 P}
8 h& r# G5 ]4 |- s/ @}
/ a  C* f! P- Z$ D5 f6 }6 f}; A( y; u7 b2 D9 V8 r) {3 [
定义一个final的变量,然后再在if语句中使用。代码如下:
- K7 V/ G6 M, o9 W3 rpublic class Hello {
6 O+ O* C) y/ I2 npublic static void main(String[] args) {
/ _$ U. K3 Z" F: hfinal boolean DEBUG = true;
5 i4 k7 V/ J$ w; P2 z" ~" `if(DEBUG) {! f3 U) X  v4 Y  U5 `- g& A
System.out.println(“Hello, world!”);4 _' d5 I0 ]. x7 i$ X- }
}
: d* X) W$ e; ]( H# X; s}
$ o2 G6 y0 A' N! U: y  E! Y}$ k( _- S0 g! y/ E& b
当条件编译使用得多时,上面将极不利于代码的修改及维护,这时就可以用一种更为灵活的方法。定义一个静态类,里面专门定义用来控制条件编译的变量。然后再在具体的代码中导入该类,使用这些final变量。代码如下:; R7 N6 A8 s2 {) r0 a7 e) h8 a
public class DebugConfig {: I8 x" I9 y$ j% P3 \6 J6 R2 ~, P
public static final boolean BLUETOOTH_DEBUG = false;
* A; U; l+ j$ H4 A, o5 Gpublic static final boolean WIRELESS_DEBUG = false;# {( x+ R/ n( r! ^# \2 N! {
}. _0 [7 ?7 n7 [. j; H! [
if ( DebugConfig.BLUETOOTH_DEBUG) {. c" V2 P% V: M6 x4 \7 U6 h: Q
// TODO
1 ]6 J" I# \5 F2 k0 X}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 22:23 , Processed in 0.158713 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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