java没有条件编译
摘自http://maosidiaoxian.iteye.com/blog/1290740
条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。代码如下:
- #IFDEF DEBUG
- #UNDEF DEBUG
- #ENDIF
- #define DEBUG
- #IFDEF DEBUUG
- /*
- code block 1
- */
- #ELSE
- /*
- code block 2
- */
- #ENDIF
但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们可能需要条件编译。那么,在JAVA中,该如何实现条件编译呢?
我们来看一个例子。
编写一个helloworld程序。代码如下:
- public class Hello {
- public static void main(String[] args) {
- System.out.println("Hello, world!");
- }
- }
保存为Hello.java并编译,得到一个class文件,并且观察到文件大小是417字节。然后我们对这个文件进行反编译,用jd-gui。得到代码如下:
- import java.io.PrintStream;
- public class Hello
- {
- public static void main(String[] paramArrayOfString)
- {
- System.out.println("Hello, world!");
- }
- }
得到这个有什么用呢?
现在我们再来对源代码进行修改,修改后的代码如下。
- public class Hello {
- public static void main(String[] args) {
- if(false) {
- System.out.println("Hello, world!");
- }
- }
- }
进行编译,这时我们再看它的大小,只有255字节。怎样?想到什么了吧?没错,编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。下面我们再来对该class文件进行反编译,果然代码如下:
- public class Hello
- {
- public static void main(String[] paramArrayOfString)
- {
- }
- }
利用JAVA编译的这一优化机制,我们就可以实现JAVA的条件编译了。
- public class Hello {
- public static void main(String[] args) {
- if(false) {
- System.out.println("Hello, world!");
- }
- }
- }
定义一个final的变量,然后再在if语句中使用。代码如下:
- public class Hello {
- public static void main(String[] args) {
- final boolean DEBUG = true;
- if(DEBUG) {
- System.out.println("Hello, world!");
- }
- }
- }
当条件编译使用得多时,上面将极不利于代码的修改及维护,这时就可以用一种更为灵活的方法。定义一个静态类,里面专门定义用来控制条件编译的变量。然后再在具体的代码中导入该类,使用这些final变量。代码如下:
- public class DebugConfig {
- public static final boolean BLUETOOTH_DEBUG = false;
- public static final boolean WIRELESS_DEBUG = false;
- }
- if ( DebugConfig.BLUETOOTH_DEBUG) {
- // TODO
- }
最最后,说一句,俺阿威师兄建议用版本控制解决这个问题(这绝对是好建议,俺振德老师就建议俺们玩一下SVN)。
http://maosidiaoxian.iteye.com/blog/1290740
java没有条件编译的更多相关文章
- 如何用Java实现条件编译
在 C 或 C++ 中,可以通过预处理语句来实现条件编译.代码如下: #define DEBUG #IFDEF DEBUUG /* code block 1 */ #ELSE /* code bloc ...
- [Java基础] Java如何实现条件编译
条件编译绝对是一个好东西.如在C或CPP中,可以通过预处理语句来实现条件编译.但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译.那么,在JAVA中,该如何实现条件编 ...
- Java学习笔记(四):流程控制
if语句 if判断语句比较简单,具体有下面的几种写法: int i = 0; // if 判断 if (i == 0) { // to do something } // if else 判断 if ...
- Java之字节码(3) - 简单介绍
转载来自 首先了解一下理论知识: 字节码: Class文件是8位字节流,按字节对齐.之所以称为字节码,是因为每条指令都只占据一个字节,所有的操作码和操作数都是按字节对齐的.如:0×03表示iconst ...
- 自然语言交流系统 phxnet团队 创新实训 个人博客 (二)
因为项目用的到条件编译,遂专门记载: 众所周知在C和CPP中可以通过预处理语句来实现条件编译,但是在java中没有预处理语句,我们该如何实现条件编译呢? 这是一个简单的demo public clas ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java条件编译
学习过C语言或者C++语言的同学都知道它们支持条件编译,那么今天我们来学习下在Java语言中如何实现条件编译.Java语言本身没有提供条件编译,但是Java编译器对.java文件编译为.class文件 ...
- Java知识点:条件编译
条件编译 一般情况下,源程序中所有的行都参加编译.但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile). ...
- Java中的条件编译(转)
源:Java中的条件编译 一直以来,不知道怎么在Java中实现像C/C++一样的#ifdef...#endif这样的预编译宏,致使Java代码中一直用if判断,刚好刚才看到了解决办法,记录一下. C/ ...
随机推荐
- MVC Razor视图引擎
Razor 不是编程语言.它是服务器端标记语言. Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法 当网页被写入浏览器时,基于服务器的代码能够创建动 ...
- pyqt menu子级方向例子学习
代码和UI文件:http://yunpan.cn/QCkXbX8mnSNke(提取码:51e1) 图片如: 代码如下: from PyQt4 import QtCore,QtGui,Qt import ...
- List数据集动态排序
List<Type> datas = new List<Type>; datas = datas.OrderBy(c => c.GetType().GetProperty ...
- 怎样实现IOS开发中的数据存储方式
iOS 开发中,一般有如下几种数据存储方式.需要根据具体的业务场景,选择 合适的数据存储方式. (1) 用户默认设置 – 这种情况通常不需要用户干预,如游戏通关信息,Video 播放记录,或者 Ap ...
- 笔记--cocos2d-x 3.0 环境搭建
一.下载资源工具 1.下载cocos2d-x 3.0 官网地址:http://www.cocos2d-x.org/filedown/cocos2d-x-3.0-cn 2.下载VS2012 地址网上搜 ...
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...
- sql语句中BEGIN TRAN...COMMIT TRAN
BEGIN TRAN标记事务開始 COMMIT TRAN 提交事务 一般把DML语句(select ,delete,update,insert语句)放在BEGIN TRAN...COMMIT TR ...
- 1.jdk、Tomcat、solr的安装和配置
1.jdk安装和配置 1)根据电脑类型,到官网下载相应的jdk版本 2)双击jdk-8u5-windows-x64.exe安装包,一直点下一步就可以了,注意记住jdk和jre的安装目录. 3)环境变量 ...
- Content-Disposition的使用和注意事项(转载)
Content-Disposition的使用和注意事项 最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相 关的协议,有的则说不用很了解.个人认为这要分层次来看待这个 ...
- .NET的 DataTable中某列求和
public DataTable ReportDetail { get; set; }//定义datatable属性 this.txtTotalPiece.Text = ReportDetail.Co ...