在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. Angular快速学习笔记(4) -- Observable与RxJS

    介绍RxJS前,先介绍Observable 可观察对象(Observable) 可观察对象支持在应用中的发布者和订阅者之间传递消息. 可观察对象可以发送多个任意类型的值 -- 字面量.消息.事件. 基 ...

  2. 【Codechef】BB-Billboards

    题解 传说中的--半标准杨表(行单调不增,列单调减) 如果N能整除M,我们把序列分成\(\frac{N}{M}\)段 然后里面要填K个1,显然我每一段必须填K个1,且可以构造出合法的序列,所以最少要填 ...

  3. 【LOJ】#2492. 「BJOI2018」二进制

    题解 每次开这样的数据结构题感想都大概是如下两点 1.为什么别人代码长度都是我的1/2???? 2.为什么我运行时间都是他们的两倍???? 简单分析一下,我们关注一个区间是否合法只关注这个区间有多少个 ...

  4. 001.hadoop及hbase部署

    一 环境准备 1.1 相关环境 系统:CentOS 7 #CentOS 6.x系列也可参考,转换相关命令即可. hadoop包:hadoop-2.7.0.tar.gz #下载官方地址:http://w ...

  5. hdu 4407 容斥原理

    题意: 1 //一组数据 3 3 //数字为1-3,3次运算 2 2 3 //将2号位变成3 1 1 3 4 //计算1-3号位上与4互质的数的和 1 2 3 6 好题,需要重复练习 #include ...

  6. java php c# 三种语言的AES加密互转

    java php c# 三种语言的AES加密互转 最近做的项目中有一个领取优惠券的功能,项目是用php写得,不得不佩服,php自带的方法简洁而又方便好用.项目是为平台为其他公司发放优惠券,结果很囧的是 ...

  7. 使用 IntraWeb (26) - 基本控件之 TIWMenu

    TIWMenu 的任务是让原来的 TMainMenu 呈现在网页上, 通过其 AttachedMenu 属性关联一个 TMainMenu 是必需的. TIWMenu 所在单元及继承链: IWCompM ...

  8. HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4818 深深地补一个坑~~~ 现场赛坑在这题了,TAT.... 今天把代码改了下,过掉了,TAT 很明显 ...

  9. How Visual Studio 2012 Avoids Prompts for Source

    [原文地址]:http://blogs.msdn.com/b/heaths/archive/2012/07/26/how-visual-studio-2012-avoids-prompts-for-s ...

  10. html5模拟平抛运动

    <html> <head> <meta charset=utf-8> <title>html5炮弹</title> <script&g ...