在C/C++中,使用#ifdef…#endif的代码,如果不满足条件,编译器是不会对这部分代码进行编译的。Java中并没有这种“条件编译”特性。这种特性在C语言里是用来解决代码的跨平台问题的,可以通过让代码的不同部分根据其运行的具体平台进行编译。由于Java本身就设计为一种跨平台的语言,因此这种特性就没有存在的必要了。

但是条件编译对于代码的调试来说还是很有用处的。就像我们在C语言中学到的一样,可以通过一些条件编译的开关来使得一些调试代码只在开发过程中使用,而在发布的版本中则不会编译进去。

那么Java是如何实现的呢?主要有两种方式:关键字import改变行为;if判断改变行为。下面分别就这两种方式给出示例。

1.import改变行为
通过修改被导入的package的方法来实现条件编译。修改的方法是将程序中用到的代码由调试版改为发布版。
具体方法:同时维护两套代码,一套放在debug包中,内部含有调试功能的语句;一套放在release包中,内部除了不含有调试功能的语句其它的与debug包中的对应程序完全相同。 这样,在调试的过程中,我们import到程序中的是debug中的类,在发布代码的时候,导入release包内的类。这样,就可以不用修改其它代码,只需要修改import语句,就实现条件编译。

condition/debug / Assert.java

package debug;

public class Assert{

//print err to console
private static void printErr(String msg){
System.out.println(msg);
}

//getName
public void setName(String name) {
printErr(name);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
condition/release / Assert.java

package release;

public class Assert{

//print err to console
private static void printErr(String msg){}

//getName
public void setName(String name) {}
}
1
2
3
4
5
6
7
8
9
10
condition/Test.java

import debug.*;
//import release.*;

public class Test{

public static void main(String args[]) {
Assert a = new Assert();
a.setName("sunpro");
}
}
1
2
3
4
5
6
7
8
9
10
11
运行效果:

2.if判断改变行为
上面这种方法是参考《Java编程思想》6.1.4 用import改变行为 这一节中参考得来的。事实上,大型代码的维护都是采用这种方法。但是我们平常写个小型的程序,要维护两套代码还是比较麻烦的。我们就像在一套代码中实现条件编译。那就要用到if语句来改变编译行为。

它的原理来自Java编译器优化机制中的一条:对于条件表达式中永远为false的语句,编译器将不对条件覆盖的代码段生成字节码。

具体的方法:
对我们想进行条件编译的类,维护一个静态的布尔值,DEBUG。通过修改该值的真假达到条件编译的目的。
实例如下:

public class IfTest {

private static final Boolean DEBUG = false;

public static void main(String args[]) {
IfTest it = new IfTest();
it.setName("sunpro");
}

public void setName(String name){
if(DEBUG)
System.err.println(name);

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
运行结果

---------------------
作者:sunpro518
来源:CSDN
原文:https://blog.csdn.net/sunjinshengli/article/details/70168219
版权声明:本文为博主原创文章,转载请附上博文链接!

Java 条件编译的更多相关文章

  1. Java条件编译

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

  2. Java知识点:条件编译

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

  3. Spark案例分析

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

  4. java没有条件编译

    摘自http://maosidiaoxian.iteye.com/blog/1290740 条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.代码如下: #IFDEF DE ...

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

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

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

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

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

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

  8. java编译期优化

    java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.ja ...

  9. [译]C++, Java和C#的编译过程解析

    1.1.1 摘要 我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把高级语言翻译成机器语言,这样计算机才能执行高级语言编写的程序,在接下来的博文中,我们将介绍非托管和托管语音的编 ...

随机推荐

  1. 利用HTML5定位功能,实现在百度地图上定位(转)

    原文:利用HTML5定位功能,实现在百度地图上定位 代码如下: 测试浏览器:ie11定位成功率100%,Safari定位成功率97%,(add by zhj :在手机上测试(用微信内置浏览器打开),无 ...

  2. 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)

    入门智能家居,从 IFTTT 到 HomeKit 自动化(二)   目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...

  3. 【BZOJ 1180】 (LCT)

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1078  Solved: 662 Descript ...

  4. mysql分页查询优化(索引延迟关联)

    对于web后台报表导出是一种常见的功能点,实际对应服务后端即数据库的排序分页查询.如下示例为公司商户积分报表导出其中一个sql ,当大批量的导出请求进入时候,mysql的cpu急剧上升瞬间有拖垮库的风 ...

  5. python使用递归实现一个分形图形

    代码如下: import turtle def main(): t = turtle.Turtle() t.hideturtle() t.speed(10) level = 12 fract(t,-8 ...

  6. nginx+uwsgi+flask 服务器配置

    注:每个机器,软件版本可能不一样,虽然网上有很多类似的帖子,但是我在搭建的时候遇到了不少的坑,此文仅供参考. 请求流程: 1.安装uwsgi uwsgi是一个应用服务器,非静态文件的网络请求就必须通过 ...

  7. 独家专访|浙江执御:为何接受富安娜入股而不选VC?_深圳市跨境电子商务协会_新浪博客

    独家专访|浙江执御:为何接受富安娜入股而不选VC?_深圳市跨境电子商务协会_新浪博客   http://blog.sina.com.cn/s/blog_13cb5d69e0102vuvk.html

  8. JTAG TAP Controller

    The TAP controller is a synchronous finite state machine that responds to changes at the TMS and TCK ...

  9. 从零开始部署CAS服务器

    从0开始部署CAS服务器的操作过程文档,我已经整理完毕,一共分为8步,这8步都是我自己操作实践过的. Setp1:Ubuntu server安装 在virtual box中安装ubuntu serve ...

  10. jPlayer插件的使用

    文讲一下本人在使用jPlayer插件时的整个过程.出现的BUG已经解决办法. 最近在做bootstrap项目,项目中需要一个响应式.兼容IE7的视频播放插件,经过上网查找,找到了所谓可以兼容到IE6的 ...