zoukankan      html  css  js  c++  java
  • Java 条件编译

    在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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    深入理解Java8中Stream的实现原理
    RocketMQ的顺序消费和事务消费
    Java 性能调优小技巧
    类加载机制基础
    十大经典排序算法
    分布式锁的几种常用实现方式
    python之接口开发
    python之urllib模块和requests模块
    python之time模块和hashlib模块
    python之os和sys模块的区别
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/10211461.html
Copyright © 2011-2022 走看看