【问题标题】:What are the benefits of "String".equals(otherString)"String".equals(otherString) 有什么好处
【发布时间】:2013-09-04 10:10:57
【问题描述】:

在教程(用于实现 xml 解析器)中,我看到了以下代码:

if( "NODENAME".equals(xmlreader.getNodeName()) ) {  // getNodeName() returns java.lang.String
... 
}

有理由写这样的字符串比较吗?

这可能是某种最佳/不好的做法或类似的代码可以带来一些性能优势。我想知道我是否应该在商业项目中使用它。

【问题讨论】:

  • if(constant == variable) 有时被称为尤达条件。它可用于避免诸如constant = variable 或Java 中的NullPointerExceptions 之类的拼写错误。

标签: java string


【解决方案1】:

这样你就不用NullPointerException.

Yoda Condition用于解决不安全的空行为。

在编程术语中,Yoda 条件(也称为 Yoda Notation)是一种编程风格,其中表达式的两个部分在条件语句中颠倒。

优点是

交换两个条件值不会改变程序的行为。一个常见的错误是意外地赋值而不是编写条件语句。

【讨论】:

  • 我认为最好也列出使用尤达条件的缺点?
【解决方案2】:

如果你有代码:

if( "NODENAME".equals(xmlreader.getNodeName()) ){...}

xmlreader.getNodeName()null 时,它将避免NullPointerException,因为

"NODENAME".equals(null)

将返回 false 而不是 NullPointerException

PS:请记住,如果由于某种原因xmlreader 本身为空,那么:

"NODENAME".equals(xmlreader.getNodeName())

仍然可以抛出NullPointerException

【讨论】:

    【解决方案3】:

    如果xmlreader.getNodeName()为空,通常字符串比较是这样写的,以避免NullPointerException,因为那样你就会有

    if("NODENAME".equals(null)) {
        // ... 
    }
    

    相比

    if(null.equals("NODENAME")) {
        // ... 
    }
    

    会抛出的。

    这称为尤达条件:

    如果您希望xmlreader.getNodeName()null,那么没关系,否则我不会依赖它来避免抛出异常,您应该在代码中更早地处理它。

    【讨论】:

    • 那张甜蜜的尤达照片加 1
    【解决方案4】:

    它称为Yoda condition,用于避免NullPointerException。关于它在商业项目中的使用,这实际上是一个设计决策 - 一些开发人员希望保护免受空值的影响,而另一些开发人员想要传统表示法提供的快速失败机制。

    【讨论】:

      【解决方案5】:

      方法equals() 检查String 的内容。 在文字上调用 equals() 方法可以将您从 NullPointerException 中解救出来,如果 xmlReader.getNodeName() 返回 null 可能会发生这种情况。在null 上调用equals 方法会导致NullPointerException

      【讨论】:

        【解决方案6】:

        如果您的印象是您也可以使用== 比较字符串,那么即使在比较中涉及两个“有意义”相等的字符串,它也会失败,因为== 会检查它是否是同一个对象。当然,正如其他答案所述,如果您在标准字符串上调用 equals ,请避免使用 NullPointeException,就像您的问题一样。

        【讨论】:

          【解决方案7】:

          由于 equals 是 java 中的内置方法,我们需要确保它应该使用对象而不是 null 来调用。所以如果我们用 null 调用,那么我们最终会得到 Null 指针异常。

          例如:假设我需要检查字符串 a 是否等于“hai”并且 a 是否来自用户。

          那么我不确定“a”是否为空。因此,如果我使用a.equals("hai"),那么如果 a 变为 null 则不安全,但如果您反转比较,那么无论 a 是否为 null,它总是安全的。

          所以总是更喜欢"hai".equals(a) 以免受空指针异常的影响。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-22
            • 1970-01-01
            • 2012-05-18
            • 2018-12-31
            • 1970-01-01
            • 2011-01-04
            • 1970-01-01
            • 2010-11-19
            相关资源
            最近更新 更多