在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. web程序快速开发

    关于web程序快速开发个人见解以及经历 由于在之前公司业务的发展,需要在基于核心业务的基础上开发其他较为独立的业务系统,所以就有了这个基于Dapper,DDD概念的基础框架,由于个人基于这个框架已经经 ...

  2. 使用Sublime Text 3的HTML-CSS-JS Prettify插件格式化代码

    很多时候,我们想要格式化HTML-CSS-JS代码,网站上有很多实现此功能的小工具,当然,我的网站首页也有.但是,如果我们的代码编辑器上面也有这样的功能,那不是更加快速便捷?So,接下来,我们看看Su ...

  3. ERROR 2003 (HY000): Can't connect to MySQL server on "192.168.xxx.xxx" (111)

    mac  homebrew 安装的mysql5.6 除本机外无法被其他ip的电脑访问. 网上查原因 有几个: 1.my.cnf配置中 查看是否有   bind-address = 127.0.0.1  ...

  4. Win7如何解决telnet不是内部或外部命令的方案!

    https://jingyan.baidu.com/article/7908e85c6ec355af491ad265.html Telnet用于远程操作互联网中的设备或终端计算机服务器,可以有效的减少 ...

  5. Nuxt.js 学习笔记

    起源 最主要的原因时使用vue-cli搭建的SPA(单页应用)不利于搜索引擎的SEO操作.搜索引擎对SPA的抓取并不好,特别是百度根本没法抓取到SPA的内容页面,所以我们必须把我们的应用在服务端渲染成 ...

  6. 初识thinkphp(3)

    这篇内容主要涉及请求相应内容. 该系列主要是个人笔记,且内容是连贯的,其中涉及到的自己写的模块或者方法在前面文章中有介绍咋来的,如果您看得云里雾里,给您带来不便,真的不好意思. 0x01:请求对象 官 ...

  7. 设计模式-装饰者模式(Decorator Pattern)

    本文由@呆代待殆原创,转载请注明出处. 此设计模式遵循的设计原则之一:类应该支持扩展,而拒绝修改(Open-Closed Principle) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...

  8. Android 前台服务

    Android 前台服务 学习自 https://blog.csdn.net/guolin_blog/article/details/11952435#t3 前台服务漫谈 我们之前学习的Service ...

  9. 系统的Drawable(一)

    系统的Drawable(一) 学习自 <Android 开发艺术探索> <官方文档> https://www.cnblogs.com/popfisher/p/6238119.h ...

  10. 漏洞利用查询工具sandi

    漏洞利用查询工具sandi   在渗透测试中,一旦发现漏洞,就需要查找该漏洞的利用方式.由于漏洞众多,就需要渗透测试人员从海量的漏洞信息找出可用攻击载荷.Kali Linux内置了一个查询工具sand ...