obj == null vs null == obj

时间:2017-12-07 18:16:12

标签: java oop

我一直习惯于检查

之类的空值
if(null==obj)

当我编译我的代码并在反编译后查看.class文件时,我可以看到我的代码已更改为

if(obj==null)

我知道在java null==objobj==null并不重要。但我很想知道为什么编译器会改变它?

2 个答案:

答案 0 :(得分:9)

编译器没有改变任何东西。它忠实地将if (null == obj)if (obj == null)编译成不同的字节码,反编译器转换回相同的Java代码。

与右边的null比较,即

if (o == null) {
    ...
}

使用ifnonnull指令转换为此字节代码:

0: aload_0
1: ifnonnull     ...

与左边的null比较,即

if (null == o) {
    ...
}
使用if_acmpne指令将

转换为不同的字节码:

0: aconst_null
1: aload_0
2: if_acmpne     ...

理论上,反编译器有足够的信息来确定参数在源文件中的排序方式。但是,他们为两个订单生成了相同的代码。

答案 1 :(得分:0)

两者在Java中都是相同的,因为只有布尔表达式可以在if中。这只是程序员和团队协议如何编写的编码风格偏好。

null != a是Java,C ++等编程语言(称为Yoda Conditions)的旧习惯。

因为编写if(a = null)并且意外地将null指定给a所以写入null是有效的,所以首先是一个防止此事故发生的警卫。

大多数程序员使用a == null只是因为它看起来更容易让人理解。可能这可能是编译器/反编译器按顺序排列它们的原因,也许还有另一个原因......