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

时间:2011-07-30 14:08:51

标签: java oop comparison

我的老板说我应该使用null == obj,因为它比obj == null好,但他不记得为什么要这样做。有没有理由使用null == obj
我感觉到它......对面!

在Google上进行一些搜索后,我发现的唯一一件事就是:

  

在C中,它可以防止你在条件结构中不小心输入(obj = null)。

6 个答案:

答案 0 :(得分:36)

您不能通过键入null来意外地将obj分配给obj = null。但是,这是C次的回忆,在java中,这是不可能的,因为=表达式返回赋值的右侧。由于null不是boolean,编译器会抱怨。

我会尝试向老板解释一次,展示它。如果他仍然不同意你,那就去做吧。与老板争吵是件小事。

答案 1 :(得分:17)

如果使用if(null==obj)编译文件,则生成的字节代码为if_acmpne,如果为if(obj==null),则为ifnonnull。现在在if_acmpne中,两个操作数从堆栈中弹出并检查它们不相等(在本例中为nullobj),在ifnonnull中,只弹出一个操作数并检查它是否为空。由此看来ifnonnull更好,因为它只涉及弹出一个操作数。

参考文献:http://www.artima.com/underthehood/flowP.html

答案 2 :(得分:11)

在Java中,没有区别。

我更喜欢(obj == null)因为感觉更自然。

答案 3 :(得分:1)

我之前从未听说过这个,但似乎你给出的推理是可靠的。我也认为它感觉倒退但是,除了“感觉”错误之外,它不应该有任何问题。我认为它没有任何性能优势或类似的东西。

答案 4 :(得分:1)

如果您在当前的Java IDE中传递了if (obj=null)if (null=obj)这样的条件,它会将其突出显示为语法错误。此外 - 尝试编译将发出错误信号。

(obj==null)(null==obj)都可以接受,它们都带有相同的开销,后者不会产生任何性能。使用它们的决定取决于为跨类维护统一风格而采用的代码风格。

答案 5 :(得分:0)

:)

我发现对此有用的一件事是,以下语法(从我的POV绝对有效)不会引起spotbugs'DC-DOUBLECHECK警告,允许提高spotbugs阈值而不会任何特殊排除等:

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