博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程点滴-关于boolean常量在判断中的位置
阅读量:6077 次
发布时间:2019-06-20

本文共 1672 字,大约阅读时间需要 5 分钟。

今天review某同学的代码时发现这样一个情况:

DEBUG是一个boolean的常量,原来是

if(DEBUG){   doSomething();}

后来因为要求在安全模式下不准打印log,于是改成这样:

if((!isSecMode()) && DEBUG){   doSomething();}

现在又增加了一种新的模式警用模式,于是改成这样:

if((!isSecMode()) && (!isPoliceMode()) && DEBUG){   doSomething();}

这样会造成一点性能和空间损失的。

如果编译器发现if(false)或者if(false && ...)这样的语句,直接就不会编译进字节码中,这是由短路规则所决定的。
而如果把DEBUG放在最后,由于不符合短路规则,后面的语句也是没必要编译进来的,但是要保证前面的判断是要执行的。
于是就生成了这样一句话

if ((!ts.isSecMode()) && (!ts.isPoliceMode()));

白白要做两次判断!

下面看看完整的代码。

源代码:

public class TestSeven {    public void doSomething(){     }    public boolean isSecMode(){        doSomething();        return false;    }    public boolean isPoliceMode(){        doSomething();        return false;    }     private static final boolean DEBUG = false;     public static void main(String[] args){        TestSeven ts = new TestSeven();        if(DEBUG && !ts.isSecMode() && !ts.isPoliceMode()){            System.out.println("DEBUG1");        }         if(!ts.isSecMode() && !ts.isPoliceMode() && DEBUG){            System.out.println("DEBUG2");        }    }}

反编译之后是这样的:

public class TestSeven{  private static final boolean DEBUG = false;   public void doSomething()  {  }   public boolean isSecMode()  {    doSomething();    return false;  }  public boolean isPoliceMode() {    doSomething();    return false;  }   public static void main(String[] args)  {    TestSeven ts = new TestSeven();     if ((!ts.isSecMode()) && (!ts.isPoliceMode()));  }}

从反编译的代码中可以看到,不管是System.out.println("DEBUG1");还是System.out.println("DEBUG2");皆是虚妄,根本就直接被编译器过滤掉了。

但是有短路规则的if(DEBUG && !ts.isSecMode() && !ts.isPoliceMode()),连一点痕迹都没留下来,而没有短路规则的第二条判断,就不得不留下if ((!ts.isSecMode()) && (!ts.isPoliceMode()));

转载地址:http://hkogx.baihongyu.com/

你可能感兴趣的文章
SharedPreferences的使用
查看>>
mysql数据迁移到mongoDB中,如何操作?
查看>>
Maven学习总结(六)——Maven与Eclipse整合
查看>>
Myeclipse常用快捷键
查看>>
初始依赖注入
查看>>
Myeclipse常用快捷键
查看>>
Java基础学习总结(15)——java读取properties文件总结
查看>>
HTTP协议详解
查看>>
Hadoop生态圈
查看>>
以太网每秒可以传输多少个数据帧?
查看>>
使用RMAN进行备份
查看>>
IPSEC ××× ---野蛮模式与动态获得地址!
查看>>
Linux下Java调试方法
查看>>
究竟为什么开发者首选 iOS ?
查看>>
渲染图片
查看>>
vrrp hsrp在企业网中的应用
查看>>
关于js 的typeof运算符
查看>>
有趣的数(动态规划)
查看>>
OCX注册错误:请确保该二进制存储在指定的路径中
查看>>
linux系统编程之进程(四):进程退出exit,_exit区别即atexit函数
查看>>