编程点滴-关于boolean常量在判断中的位置

编程点滴-关于boolean常量在判断中的位置

今天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()));

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,786评论 18 399
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,807评论 0 7
  • 不敢靠近, 可能没出息,可能怕失去, 越努力越没有了勇气, 不知明天的自己会在哪里, 不知,你是否愿意…… 忍住眼...
    _浪子_阅读 322评论 0 2
  • 我想给你写信 用被这个时代冷落的方式 或许到了下个时代 也免不了受人哂笑 但这是唯一的 最最郑重的方式 至少对你是...
    周不懂阅读 1,044评论 34 32
  • 幸福就是健康与快乐。什么样的人更加幸福和快乐呢?哈佛大学对不同阶层的人,多长达数十年的研究显示,幸福与我们苦苦追求...
    思维工具箱阅读 170评论 0 1