我老板说我应该使用“null == obj”,因为它比“obj == null”更好,但他忘记了为什么要这样做。使用“null == obj”有什么原因吗?我感觉这有点相反!在 Google 上搜索后,我发现唯一的东西是:“在 C 语言中,它可以防止你在条件结构中意外输入(obj = null)。”
当你输入obj = null
时,不能意外地将null
赋值给obj
。然而,这是C语言的一个回忆,在Java中不可能发生,因为=
表达式返回赋值右侧的值。由于null
不是boolean
类型,编译器会报错。
我会尝试向我的老板解释并演示它。如果他仍然不同意,那就去做吧。为这种小事与老板争吵是不值得的。
obj
是一个布尔值类型,那么 if (obj = null)
不会触发编译错误。 - user330315在C语言中,当你本意要写== null时,可能会错误地写成if (obj = null)......,从而获得两个错误: 对象引用被设置为null if后面的条件隐含地变为false
- Luke VoBoolean
变量设置为null。为什么不行呢?Boolean flag; flag = null;
因此if (flag = null)
将会编译通过,没有问题。 - user330315if(null==obj)
编译文件,生成的字节码是if_acmpne
,而如果使用if(obj==null)
则为ifnonnull
。现在,在if_acmpne
中,两个操作数从堆栈中弹出并检查它们是否不相等(在此情况下为null
和obj
),而在ifnonnull
中,只弹出一个操作数并检查它是否不为null。因此,ifnonnull
似乎更好,因为它仅涉及弹出一个操作数。在Java中,没有差别。
我更喜欢使用 (obj==null),因为它感觉更加自然。
if (obj=null)
或if (null=obj)
,它会将其标记为语法错误,并且在尝试编译时会发出错误信号。
(obj==null)
和(null==obj)
都是可接受的,它们都具有相同的开销,后者不会产生任何性能。使用哪种方式取决于采用的代码风格,以保持类之间的统一样式。请注意,保留HTML标签。我以前从未听说过这个,但是你给出的理由似乎很有道理。我也觉得它感觉上有些反常,但除了“感觉”不对之外,它不应该有任何问题。我认为它不会带来任何性能优势或类似的东西。
:)
我发现这个东西有用的一点是,下面的语法(在我看来绝对有效)不会引起spotbugs
的DC-DOUBLECHECK
警告,允许提高spotbugs
的阈值而无需进行任何特殊的排除等操作:
if (defaultClient == null) {
synchronized (DEFAULT_CLIENT_INIT_LOCK) {
if (null == defaultClient) {
...
}
}
}