我一直习惯于检查
之类的空值if(null==obj)
当我编译我的代码并在反编译后查看.class文件时,我可以看到我的代码已更改为
if(obj==null)
我知道在java null==obj
和obj==null
并不重要。但我很想知道为什么编译器会改变它?
答案 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
只是因为它看起来更容易让人理解。可能这可能是编译器/反编译器按顺序排列它们的原因,也许还有另一个原因......