(obj == null) vs (null == obj)?

48
我老板说我应该使用“null == obj”,因为它比“obj == null”更好,但他忘记了为什么要这样做。使用“null == obj”有什么原因吗?我感觉这有点相反!在 Google 上搜索后,我发现唯一的东西是:“在 C 语言中,它可以防止你在条件结构中意外输入(obj = null)。”

7
我唯一知道的就是你在Google上发现的东西。这可能是你的老板受到C编程的影响。话虽如此,我不建议你与之对抗。 - Patrick87
2
我认为这个想法是从C语言延续下来的。 - Hovercraft Full Of Eels
2
绝对是C语言的事情。个人不会选择它,因为它完全是反向阅读的。 - Ken Wayne VanderLinde
那么,在Java中它是无用的和不自然的?我不仅指性能方面的好处,还包括(null == obj)可能带来的任何好处吗?我希望会有更好的答案,所以如果明天没有更好的答案,我将标记Femaref的答案。 - Luke Vo
我正在2020年阅读这个问题,我想说每次看到"null == obj"都会让我感到困扰,这也是我来到这个页面的原因。它似乎很不自然,因此我认为写"null == obj"比"obj == null"不太有效率,因为它会让未来的开发人员/维护人员感到烦恼。当然,你可以习惯某些东西,但如果它是不必要的,那么你就没有必要这样做。 - OuuGiii
6个回答

48

当你输入obj = null时,不能意外地将null赋值给obj。然而,这是C语言的一个回忆,在Java中不可能发生,因为=表达式返回赋值右侧的值。由于null不是boolean类型,编译器会报错。

我会尝试向我的老板解释并演示它。如果他仍然不同意,那就去做吧。为这种小事与老板争吵是不值得的。


12
通常来说,这个语句是正确的,但有一个例外:如果 obj 是一个布尔值类型,那么 if (obj = null) 不会触发编译错误。 - user330315
在Google的搜索结果中,他(她)解释说:在C语言中,当你本意要写== null时,可能会错误地写成if (obj = null)......,从而获得两个错误: 对象引用被设置为null if后面的条件隐含地变为false - Luke Vo
@a_horse_with_no_name:Boolean 是一个对象类型,它不能被设置为 null。 - Daniel
@Dani:当然可以将Boolean变量设置为null。为什么不行呢?Boolean flag; flag = null;因此if (flag = null)将会编译通过,没有问题。 - user330315
3
尝试将flag定义为“布尔值(Boolean)”并测试一下 :) - user330315
显示剩余2条评论

24
如果你使用if(null==obj)编译文件,生成的字节码是if_acmpne,而如果使用if(obj==null)则为ifnonnull。现在,在if_acmpne中,两个操作数从堆栈中弹出并检查它们是否不相等(在此情况下为nullobj),而在ifnonnull中,只弹出一个操作数并检查它是否不为null。因此,ifnonnull似乎更好,因为它仅涉及弹出一个操作数。
参考文献: http://www.artima.com/underthehood/flowP.html

17

在Java中,没有差别。

我更喜欢使用 (obj==null),因为它感觉更加自然。


下次请把它作为评论,这并不是一个真正的答案。 - max_
1
@XcodeDev 这是一个相当简单的问题,除非需要大量关于编译器细节的离题信息? - Chris Mowforth
4
这是一个完美的答案,特别是考虑到整个问题是“(obj == null) vs (null == obj)?”,其范围非常模糊。 - Ken Wayne VanderLinde

2
如果你在现代的Java IDE中传递一个条件,例如if (obj=null)if (null=obj),它会将其标记为语法错误,并且在尝试编译时会发出错误信号。 (obj==null)(null==obj)都是可接受的,它们都具有相同的开销,后者不会产生任何性能。使用哪种方式取决于采用的代码风格,以保持类之间的统一样式。请注意,保留HTML标签。

1

我以前从未听说过这个,但是你给出的理由似乎很有道理。我也觉得它感觉上有些反常,但除了“感觉”不对之外,它不应该有任何问题。我认为它不会带来任何性能优势或类似的东西。


0

:)

我发现这个东西有用的一点是,下面的语法(在我看来绝对有效)不会引起spotbugsDC-DOUBLECHECK警告,允许提高spotbugs的阈值而无需进行任何特殊的排除等操作:

if (defaultClient == null) {
    synchronized (DEFAULT_CLIENT_INIT_LOCK) {
        if (null == defaultClient) {
            ...
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接