Java &引用;使用布尔文字“quot;”的相等性测试测试布尔值与使用布尔值的区别==

Java &引用;使用布尔文字“quot;”的相等性测试测试布尔值与使用布尔值的区别==,java,coding-style,codepro,Java,Coding Style,Codepro,我正在使用以查看我的应用程序代码和随消息报告的工具: 警告:使用布尔文字进行相等性测试 对于此代码: boolean valid; if(valid == true) 可通过以下方式固定: if(valid) 我脑子里有两个问题: 这只是一个好的编码实践吗 在内存优化或优化方面还有其他好处吗 性能优化 行为上没有区别,虽然我不能对每个JVM都权威地发言,但很难想象会有任何性能上的差异。我认为这是一种更好的做法。第一,代码更紧凑。第二,代码读起来更像自然语言 我不知道这样或那样有什么好处。我

我正在使用以查看我的应用程序代码和随消息报告的工具:

警告:使用布尔文字进行相等性测试

对于此代码:

boolean valid;
if(valid == true)
可通过以下方式固定:

if(valid) 
我脑子里有两个问题:

  • 这只是一个好的编码实践吗
  • 在内存优化或优化方面还有其他好处吗 性能优化

  • 行为上没有区别,虽然我不能对每个JVM都权威地发言,但很难想象会有任何性能上的差异。

    我认为这是一种更好的做法。第一,代码更紧凑。第二,代码读起来更像自然语言


    我不知道这样或那样有什么好处。我的猜测是,Java编译器非常成熟,两个选项的性能几乎相同。

    对于更直接的布尔表达式:

    boolean valid = true;
    
    if(valid) {
    }
    
    生成以下字节码:

    0: iconst_1      
    1: istore_1      
    2: iload_1       
    3: ifeq          6
    6: return     
    
    0: iconst_1      
    1: istore_1      
    2: iload_1       
    3: iconst_1      
    4: if_icmpne     7
    7: return
    
    鉴于扩大比较:

    boolean valid = true;
    
    if(valid == true) {
    }
    
    生成以下字节码:

    0: iconst_1      
    1: istore_1      
    2: iload_1       
    3: ifeq          6
    6: return     
    
    0: iconst_1      
    1: istore_1      
    2: iload_1       
    3: iconst_1      
    4: if_icmpne     7
    7: return
    
    我怀疑
    ifeq
    if\u icmpne
    的执行速度不同,因此
    if(valid==true)
    的额外成本实际上只是额外的常量值,可以忽略不计

    总而言之,这并没有真正的性能差异,CodePro只是将您的代码标记为最佳实践

    这只是一个好的编码实践吗

    对。原因有二:

    • b==true
      习语冗长且语言丑陋。(你会问:“教皇是天主教徒吗?”还是“教皇是天主教徒?”…)

    • b==true
      习惯用法是Java中唯一一种可能被误写为
      b=true
      的情况

    在内存优化或性能优化方面还有其他好处吗

    几乎可以肯定不是

    当两位代码产生不同的字节码时,JIT编译器很可能会将它们转换为相同的本机指令序列,或者转换为具有相同性能的序列。(如果不是,则优化器“缺少技巧”)


    无论哪种方式,差异都可能太小而不是太小而不是太大。

    对于我提出的第一个问题,是的,这是一个很好的做法。关于第二个问题,我没有任何专业知识,但我的直觉是,至少在内存优化或性能方面应该是一样好的optimization@Tako我希望你的意思是
    如果(有效)
    是一个好的做法。将布尔值与
    true
    进行比较是个坏主意。阿什:道理很简单
    2
    为true,但
    2==true
    为false。更一般地说,任何非零的值都是真的。如果您认为编写
    If(valid==true)
    更好,那么为什么不
    If(!((valid==true)!=false&&(!valid!=true))==!true)
    ?@MattBall的精确副本呢。谢谢,侧边栏!非常感谢你的解释。我认为这有助于提高可读性
    if(isValid)
    if(isValid==true)
    读起来更好。