java没有条件编译
2024-10-15 16:06:37
摘自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设计模式之2-简单工厂模式
- 【学习笔记】JAva编程思想之多态
- WPF-编程问题和解决
- 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
- RCE via XStream object deserialization &;&; SECURITY-247 / CVE-2016-0792 XML reconstruction Object Code Inject
- DAY2 Python 标准库 ->; Getpass 模块 ->; 命令行下输入密码的方法.
- 读《编写可维护的JavaScript》第一章总结
- Thinkphp 不显示生成的验证码 【转载】
- C++的优秀特性6:智能指针
- APT攻防对抗
- poj 2689 大范围内素数筛选
- QT中LineEdit、TextEdit 、PlainTextEdit 三个控件的区别
- IE浏览器img不显示解决
- A Reliability-Aware Network Service Chain Provisioning With Delay Guarantees in NFV-Enabled Enterprise Datacenter Networks
- python中字符串的拼接
- 基本的java加密算法MD5等等
- Python设计模式 - UML - 组件图(Component Diagram)
- 当x,y和theta都是向量的时候如何计算损失
- IIS日志存入数据库之二:ETW
- Linux应用调试-strace命令
热门文章
- poj 3685 Matrix(二分搜索之查找第k大的值)
- ios实现程序切入后台,实现后台任务
- c++之 变量
- Max Sum of Max-K-sub-sequence(单调队列)
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON() —(转)
- 程序猿都是project师吗?
- 在Maven的配置文件中,自定义私有仓库地址和设置下载的jar包的保存位置
- 0119——UIImageView的一些属性 和 简单动画实现
- Ext.net GridPanel获取选中行的数据
- Struts2体系结构图以及详解