我过去一直使用以下方式检查 null 值:
if(null==obj)
当我编译我的代码并在反编译后查看.class文件时,我发现我的代码已经被更改为
if(obj==null)
我知道在 Java 中,null==obj
和 obj==null
没有区别。但是我很好奇编译器为什么会更改它呢?
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 ...
aconst_null
,aload_1
,if_acmpne
(最后一个是“如果不相等”)。Java 1.8.0_45也是如此。我还没有尝试过Java 9。 - yshavit在Java中,它们是相同的,因为if语句中只能包含布尔表达式。这只是程序员和团队协议如何编写的一种编码风格偏好。
null != a
是编程语言(如Java、C++)中的一种旧实践,也称为Yoda条件。
由于可以编写if (a = null
)并意外地将null赋给a,因此首先写入null是防止发生此意外的保护措施。
大多数程序员使用a == null
只是因为它看起来更简单易懂。可能这就是编译器/反编译器将它们放置在这样的顺序中的原因,也许还有其他原因...
obj==null
可能只是内部的归一化形式。 - yshavitjavap -c
查看字节码本身,无需反编译。 - yshavitifnonnull
指令,因此原始顺序在.class
文件中不再存在。 - Bubletan