摘自http://maosidiaoxian.iteye.com/blog/1290740

条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。代码如下:

  1. #IFDEF DEBUG
  2. #UNDEF DEBUG
  3. #ENDIF
  4. #define DEBUG
  5. #IFDEF DEBUUG
  6. /*
  7. code block 1
  8. */
  9. #ELSE
  10. /*
  11. code block 2
  12. */
  13. #ENDIF

  但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们可能需要条件编译。那么,在JAVA中,该如何实现条件编译呢? 
  我们来看一个例子。 
  编写一个helloworld程序。代码如下:

  1. public class Hello {
  2. public static void main(String[] args) {
  3. System.out.println("Hello, world!");
  4. }
  5. }

  保存为Hello.java并编译,得到一个class文件,并且观察到文件大小是417字节。然后我们对这个文件进行反编译,用jd-gui。得到代码如下:

  1. import java.io.PrintStream;
  2. public class Hello
  3. {
  4. public static void main(String[] paramArrayOfString)
  5. {
  6. System.out.println("Hello, world!");
  7. }
  8. }

  得到这个有什么用呢? 
  现在我们再来对源代码进行修改,修改后的代码如下。

  1. public class Hello {
  2. public static void main(String[] args) {
  3. if(false) {
  4. System.out.println("Hello, world!");
  5. }
  6. }
  7. }

  进行编译,这时我们再看它的大小,只有255字节。怎样?想到什么了吧?没错,编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。下面我们再来对该class文件进行反编译,果然代码如下:

  1. public class Hello
  2. {
  3. public static void main(String[] paramArrayOfString)
  4. {
  5. }
  6. }

  利用JAVA编译的这一优化机制,我们就可以实现JAVA的条件编译了。

  1. public class Hello {
  2. public static void main(String[] args) {
  3. if(false) {
  4. System.out.println("Hello, world!");
  5. }
  6. }
  7. }

  定义一个final的变量,然后再在if语句中使用。代码如下:

  1. public class Hello {
  2. public static void main(String[] args) {
  3. final boolean DEBUG = true;
  4. if(DEBUG) {
  5. System.out.println("Hello, world!");
  6. }
  7. }
  8. }

  当条件编译使用得多时,上面将极不利于代码的修改及维护,这时就可以用一种更为灵活的方法。定义一个静态类,里面专门定义用来控制条件编译的变量。然后再在具体的代码中导入该类,使用这些final变量。代码如下:

  1. public class DebugConfig {
  2. public static final boolean BLUETOOTH_DEBUG = false;
  3. public static final boolean WIRELESS_DEBUG = false;
  4. }
  1. if ( DebugConfig.BLUETOOTH_DEBUG) {
  2. // TODO
  3. }

  最最后,说一句,俺阿威师兄建议用版本控制解决这个问题(这绝对是好建议,俺振德老师就建议俺们玩一下SVN)。

http://maosidiaoxian.iteye.com/blog/1290740

最新文章

  1. JAVA设计模式之2-简单工厂模式
  2. 【学习笔记】JAva编程思想之多态
  3. WPF-编程问题和解决
  4. 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
  5. RCE via XStream object deserialization && SECURITY-247 / CVE-2016-0792 XML reconstruction Object Code Inject
  6. DAY2 Python 标准库 -> Getpass 模块 -> 命令行下输入密码的方法.
  7. 读《编写可维护的JavaScript》第一章总结
  8. Thinkphp 不显示生成的验证码 【转载】
  9. C++的优秀特性6:智能指针
  10. APT攻防对抗
  11. poj 2689 大范围内素数筛选
  12. QT中LineEdit、TextEdit 、PlainTextEdit 三个控件的区别
  13. IE浏览器img不显示解决
  14. A Reliability-Aware Network Service Chain Provisioning With Delay Guarantees in NFV-Enabled Enterprise Datacenter Networks
  15. python中字符串的拼接
  16. 基本的java加密算法MD5等等
  17. Python设计模式 - UML - 组件图(Component Diagram)
  18. 当x,y和theta都是向量的时候如何计算损失
  19. IIS日志存入数据库之二:ETW
  20. Linux应用调试-strace命令

热门文章

  1. poj 3685 Matrix(二分搜索之查找第k大的值)
  2. ios实现程序切入后台,实现后台任务
  3. c++之 变量
  4. Max Sum of Max-K-sub-sequence(单调队列)
  5. 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON() —(转)
  6. 程序猿都是project师吗?
  7. 在Maven的配置文件中,自定义私有仓库地址和设置下载的jar包的保存位置
  8. 0119——UIImageView的一些属性 和 简单动画实现
  9. Ext.net GridPanel获取选中行的数据
  10. Struts2体系结构图以及详解