a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 678|回复: 0

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
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}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 02:40 , Processed in 0.201293 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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