摘自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

java没有条件编译的更多相关文章

  1. 如何用Java实现条件编译

    在 C 或 C++ 中,可以通过预处理语句来实现条件编译.代码如下: #define DEBUG #IFDEF DEBUUG /* code block 1 */ #ELSE /* code bloc ...

  2. [Java基础] Java如何实现条件编译

    条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译.那么,在JAVA中,该如何实现条件编 ...

  3. Java学习笔记(四):流程控制

    if语句 if判断语句比较简单,具体有下面的几种写法: int i = 0; // if 判断 if (i == 0) { // to do something } // if else 判断 if ...

  4. Java之字节码(3) - 简单介绍

    转载来自 首先了解一下理论知识: 字节码: Class文件是8位字节流,按字节对齐.之所以称为字节码,是因为每条指令都只占据一个字节,所有的操作码和操作数都是按字节对齐的.如:0×03表示iconst ...

  5. 自然语言交流系统 phxnet团队 创新实训 个人博客 (二)

    因为项目用的到条件编译,遂专门记载: 众所周知在C和CPP中可以通过预处理语句来实现条件编译,但是在java中没有预处理语句,我们该如何实现条件编译呢? 这是一个简单的demo public clas ...

  6. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  7. Java条件编译

    学习过C语言或者C++语言的同学都知道它们支持条件编译,那么今天我们来学习下在Java语言中如何实现条件编译.Java语言本身没有提供条件编译,但是Java编译器对.java文件编译为.class文件 ...

  8. Java知识点:条件编译

    条件编译 一般情况下,源程序中所有的行都参加编译.但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile).   ...

  9. Java中的条件编译(转)

    源:Java中的条件编译 一直以来,不知道怎么在Java中实现像C/C++一样的#ifdef...#endif这样的预编译宏,致使Java代码中一直用if判断,刚好刚才看到了解决办法,记录一下. C/ ...

随机推荐

  1. WifiDog and OpenWrt

    $Id$ 2   3 OpenWRT specific README 4 ======================= 5   6 So, you want to run wifidog on on ...

  2. 文本去重之SimHash算法

    文本去重之SimHash算法 - pathenon的个人页面 - 开源中国社区 文本去重之SimHash算法

  3. c++ 友元类

    一.友元类相关概念 要将私有成员数据或函数暴露给另一个类,必须将后者声明为友元类. 注意三点: (1)友元关系不能传递 (2)友元关系不能继承 (3)友元关系不能互通

  4. textChanged(*)重点

    # -*- coding: cp936 -*- import sys from PyQt4 import QtCore, QtGui class MyDialog(QtGui.QDialog): de ...

  5. SpringMVC(二)——流程控制

    SpringMVC主要就是用来做流程控制的,这篇博客总结一下如何在流程控制添加Interceptor(拦截器),如何将进行流程Mapping映射解析,如何编写Controller(控制器). 一,首先 ...

  6. POJ 2524 并查集

    Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23580 Accepted: 1160 ...

  7. 前端判断用户请求是PC还是移动端

    链接:https://www.zhihu.com/question/20004700/answer/13678113 第一步先在服务器端使用User Agent判断,先匹配出移动设备,这一步可以统计U ...

  8. [转]Asp.Net调用前台js调用后台代码分享

    1.C#前台js调用后台代码 前台js <script type="text/javascript" language="javascript"> ...

  9. ios 调用相机后 view 下沉问题

    我只加了一句代码 现在不报错了  因为这个问题是随机性的  我也不太明白这个地方是怎么回事   我只是这样子做了  问题不出来了 if ([[[UIDevice currentDevice] syst ...

  10. CDZSC_2015寒假新人(2)——数学 G

    G - G Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...