【问题标题】:(obj == null) vs (null == obj)?(obj == null)与(null == obj)?
【发布时间】:2023-04-02 21:11:01
【问题描述】:

我的老板说我应该使用null == obj,因为它比obj == null 好,但他不记得为什么要这样做。使用null == obj有什么理由吗?
我感觉它以某种方式......相反!

在谷歌上搜索后,我唯一找到的是:

在 C 中,它可以防止您在条件结构中意外键入 (obj = null)。

【问题讨论】:

  • 我唯一知道的是您在 Google 上找到的内容。这可能是您的老板受到 C 编程的限制。话虽如此,我不会反对它。
  • 我认为这个想法是 C 的保留。
  • 绝对是 C 的东西。我个人不会这样做,因为它完全倒着读。
  • 那么......它在 Java 中是无用且不自然的吗?我的意思不仅仅是性能优势,只是任何好处(null == obj)可能会带来?我希望会有更好的答案,所以如果明天没有更好的答案,我会标记 Femaref 的答案。
  • 2020年我在看这个问题,想说“null == obj”每次看到都脑洞大开,这也是我来这个页面的原因.这似乎不自然,因此,我会说编写“null == obj”的效率低于“obj == null”,因为它会惹恼大多数未来的代码开发人员/维护人员。当然,你可以习惯一些东西,但如果没有必要,你就不必。

标签: java oop comparison


【解决方案1】:

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

我会尝试向我的老板解释一次,演示一下。如果他仍然不同意你,那就去做吧。和老板吵架是小事。

【讨论】:

  • 一般来说,该陈述是正确的,但有一个例外:如果objBoolean,那么if (obj = null) 不会触发编译器错误
  • 在谷歌结果上,他(她)解释说:In C it is possible to write if (obj = null) . . . by mistake (when you intended to write == null) and you get two errors for the price of one: The object reference is set to null The condition after the if becomes false implicitly
  • @a_horse_with_no_name: Boolean 是对象类型,不能设为null
  • @Dani:当然你可以将Boolean 变量设置为null。为什么不? Boolean flag; flag = null; 因此if (flag = null) 将毫无问题地编译。
  • @ratchet 怪胎:尝试将标志定义为Boolean :)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在 Java 中,没有区别。

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

    【讨论】:

    • 不是一个真正的答案,你应该下次发表评论。
    • @XcodeDev 公平地说,这是一个相当简单的问题,除非需要大量有关编译器细节的切线信息?
    • @XcodeDev:这是一个完美的答案。特别是考虑到整个问题是“(obj == null)vs(null == obj)?”,其范围相当模糊。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      如果您在当今的 java IDE 中确实传递了 if (obj=null)if (null=obj) 之类的条件,它将突出显示为语法错误,此外 - 尝试编译将发出错误信号。

      (obj==null)(null==obj) 都是可以接受的,它们都承载相同的开销,后者不会产生任何性能。使用哪一种的决定取决于所采用的代码风格,以保持跨类的统一风格。

      【讨论】:

        【解决方案6】:

        :)

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-27
          • 1970-01-01
          • 2016-09-15
          相关资源
          最近更新 更多