在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. smali 语言语法

    Androidkiller 可以反编译Android的apk,生成一种.smali代码.(这理解好像不对) 网上找了一篇smali的语法手册,可以方便查找,文章名<Smali文件语法参考> ...

  2. Spring-Session实现Session共享实现原理以及源码解析

    知其然,还要知其所以然 ! 本篇介绍Spring-Session的整个实现的原理.以及对核心的源码进行简单的介绍! 实现原理介绍 实现原理这里简单说明描述: 就是当Web服务器接收到http请求后,当 ...

  3. 使用ajax与jqplot的小体会

    在使用ajax与jqplot时遇到了传值的问题!一开始都不知值是怎么传过去的,只找到了例子是以<div id="data">原始数据</div>这样子来接收 ...

  4. 玩转SpringCloud Spring Cloud 微服务

    Spring Cloud 简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

  5. 不同浏览器的userAgent

    一.IE浏览器 //IE6 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" //IE7 "Mozill ...

  6. code vs 1094 FBI树 2004年NOIP全国联赛普及组

    题目描述 Description 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树[1],它的结点类型 ...

  7. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  8. 20172308《Java软件结构与数据结构》第三周学习总结

    教材学习内容总结 第 5 章 队列 队列: 一种线性集合,其元素从一端加入,从另一端删除 元素处理:FIFO 与栈的比较 异:(1) 栈的处理过程只在栈的某一端进行:队列的处理过程在队列的两端进行.( ...

  9. CentOS下使用autoenv实现进入特定目录后运行特定环境变量

    安装 # Mac git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv # 安装默认shell echo 'source ~/. ...

  10. CentOS 7下KVM支持虚拟化/嵌套虚拟化配置

    开启虚拟化: cat << EOF > /etc/modprobe.d/kvm-nested.conf options kvm-intel nested=1 options kvm- ...