[Java基础] Java如何实现条件编译

news/2024/7/5 2:17:38

条件编译绝对是一个好东西。如在C或CPP中,可以通过预处理语句来实现条件编译。但是在JAVA中却没有预处理,宏定义这些东西,而有时在一些项目中,我们又需要条件编译。那么,在JAVA中,该如何实现条件编译呢?

条件编译绝对是一个好东西。如在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 
} 

 


http://lihuaxi.xjx100.cn/news/245769.html

相关文章

《Programming WPF》翻译 第7章 3.笔刷和钢笔

原文:《Programming WPF》翻译 第7章 3.笔刷和钢笔为了在屏幕上绘制一个图形,WPF需要知道你想要为图形填充什么颜色以及如何绘制它的边框。WPF提供了一些Brush类型支持各种绘图样式。Pen类增加这些笔刷以提供边框的厚度和样子。 在这一章,我们将要看一下…

mysql innodb引擎丢失_【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据...

注意!此方法只适用于innodb_file_per_table独立表空间的InnoDB实例。此种方法可以恢复ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据的100%恢复,目的是尽可能多的恢复。恢复数据前…

JXJJOI2018_T1_market

题目描述 某天Lemon去超市买柠檬,他发现货架上有N个柠檬,每个柠檬都有一个重量Wi和价格Ci。 Lemon身上只带了S元钱,因此他想要买一个价格不超过S的柠檬回家,另外,他希望他买的那个柠檬的性价比尽量高。 性价比的定义是…

【转】ubuntu 12.04 下 Vim 插件 YouCompleteMe 的安装

原文网址:http://www.cnblogs.com/jostree/p/4137402.html 作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4137402.html 1.需要保证vim的版本大于7.3.584,否则的话需要更新vim 可以通过第三方源更新: 在终端输入…

You Only Learn One Representation: Unified Network for Multiple Tasks

You Only Learn One Representation: Unified Network for Multiple Tasks一、引言(一)、 Explicit deep learning(二)、Implicit deep learning(三)、Knowledge modeling(四)、Kernel space alignment二、…

思科三层交换机配置命令

Enable //进入私有模式Configure terminal //进入全局模式service password-encryption //对密码进行加密hostname Catalyst 3550-12T1 //给三层交换机定义名称enable password 123456. //enable密码Enable secret 654321 …

jdbc mysql select_java连接mysql数据库并使用jdbc进行查询详解

public Connection getCon() {//数据库连接名称String username"root";//数据库连接密码String password"";String driver"com.mysql.jdbc.Driver";//其中test为数据库名称String url"jdbc:mysql://localhost:3306/test";Connection c…

Linux查看进程线程个数

1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p ps -e | grep server | awk {print $1} # pstree -p ps -e | grep server | awk {print $1} | wc -l 这里利用了管道和命令替换, 关于命令替…