编程点滴-关于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月前
|
JavaScript 前端开发
编程笔记 html5&css&js 068 JavaScript Boolean数据类型
编程笔记 html5&css&js 068 JavaScript Boolean数据类型
|
1月前
|
SQL 流计算 OceanBase
OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
【2月更文挑战第25天】OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
28 3
|
6月前
|
前端开发 JavaScript
前端基础 - JavaScript值Boolean类型的默认转换
前端基础 - JavaScript值Boolean类型的默认转换
30 0
|
26天前
|
IDE Java 开发工具
阿里巴巴不建议 boolean 类型变量用 isXXX
阿里巴巴不建议 boolean 类型变量用 isXXX
11 1
|
29天前
|
算法 测试技术 编译器
【C++ 基本类型 bool 】深入探索C++中的布尔类型Boolean(二 )
【C++ 基本类型 bool 】深入探索C++中的布尔类型Boolean
27 0
|
29天前
|
程序员 编译器 C语言
【C++ 基本类型 bool 】深入探索C++中的布尔类型Boolean(一)
【C++ 基本类型 bool 】深入探索C++中的布尔类型Boolean
39 0
|
4月前
|
IDE Java 开发工具
阿里巴巴不建议 boolean 类型变量用isXXX的理由?
平时工作中大家经常使用到boolean以及Boolean类型的数据,前者是基本数据类型,后者是包装类,为什么不推荐使用isXXX来命名呢?到底是用基本类型的数据好呢还是用包装类好呢?
|
8月前
|
JavaScript
TypeScript 与 JS 中类型首字母大小写区别(String、string、Number、number、Boolean、boolean ...)
TypeScript 与 JS 中类型首字母大小写区别(String、string、Number、number、Boolean、boolean ...)
167 0
|
JavaScript
js:常见对象的类型判断typeof和布尔值Boolean
js:常见对象的类型判断typeof和布尔值Boolean
82 0
|
存储 Java 容器
Boolean包装类型
博主今天在工作中发现了Boolean包装类型的使用,由此整理了相关内容,下面我们一起来看下吧。
123 0
Boolean包装类型

热门文章

最新文章