我正在使用Code Pro查看我的应用程序代码,并且该工具报告了以下消息:
警告:使用布尔文字进行相等性测试
对于此代码:
boolean valid;
if(valid == true)
可以使用以下方法修复:
if(valid)
我有两个问题:
- 这只是一个好的编码习惯吗?
- 在内存优化或性能优化方面还有其他好处吗?
我正在使用Code Pro查看我的应用程序代码,并且该工具报告了以下消息:
警告:使用布尔文字进行相等性测试
对于此代码:
boolean valid;
if(valid == true)
可以使用以下方法修复:
if(valid)
我有两个问题:
对于更直接的布尔表达式:
boolean valid = true;
if(valid) {
}
生成以下字节码:
0: iconst_1
1: istore_1
2: iload_1
3: ifeq 6
6: return
而通过扩展比较:
boolean valid = true;
if(valid == true) {
}
生成以下字节码:
0: iconst_1
1: istore_1
2: iload_1
3: iconst_1
4: if_icmpne 7
7: return
我怀疑ifeq
和if_icmpne
不同的执行速度,所以额外的成本if(valid == true)
实际上只是额外的常数值,可以忽略不计。
总而言之,实际上没有性能差异,并且 CodePro 仅将您的代码标记为最佳实践。
我会说这更像是一种很好的做法。一、代码更紧凑。第二,代码读起来更像自然语言。
我不知道一种或另一种方式是否有任何好处。我的猜测是 Java 编译器非常成熟,两个选项的性能大致相同。
这只是一个好的编码习惯吗?
是的。两个原因:
这个b == true
成语冗长且语言丑陋。(你会问,“教皇是天主教徒是真的吗?”或“教皇是天主教徒吗?”......?)
该b == true
成语是 Java 中唯一一种可能被误写为b = true
.
在内存优化或性能优化方面还有其他好处吗?
几乎可以肯定不是。
当这两位代码产生不同的字节码时,JIT 编译器很可能会将它们转换为相同的本机指令序列,或者具有相同性能的序列。(如果不是,那么优化器“错过了一个技巧”)。
无论哪种方式,差异都可能太小而不能太小而不能显着。
行为没有区别,虽然我不能对每个 JVM 发表权威的看法,但很难想象会有任何性能差异可言。