【问题标题】:String equality in JavaJava中的字符串相等
【发布时间】:2010-12-30 22:23:29
【问题描述】:

我在检查两个 Java String 的相等性时看到了这两个:

// Method A
String string1;
// ...
if("MyString".equals(string1)) {
    // ...
}

和

// Method B
String string1;
// ...
if(string1.equals("MyString")) {
    // ...
}

我的问题是:哪一个更好,使用更广泛?

【问题讨论】:

  • 谢谢大家的回答。我已经习惯了彼得所描述的事情,尽管现在我意识到如果null 是可能的,选项 1 可能会更好。

标签: java string coding-style


【解决方案1】:

如果您确定 string1 永远不会为空,那么选项 2 是可读且首选的。否则选项 1。选项 1 的目的是避免潜在的空指针。

【讨论】:

  • 为什么这被否决了?确实,选项 2 更自然(与文字相比变量,反之亦然),除非考虑空值。
  • 请。投反对票的先生们能解释一下原因吗?
  • 不确定谁投了反对票,但我可以再次看到一个论点,即“首选选项 2”的声明。根据我的经验,选项 1 是首选,因为选项 2 不考虑您解释的空值。
  • @jzd - 这就是为什么我提到前提条件“如果您确定 string1 永远不能为空”
  • 我总是选择第一种形式。我不同意第二种形式更具可读性,因此第一种形式的安全性胜出。尽管您可能相信您永远不会获得null 引用,但您的代码有一天可能会以意想不到的方式使用,因此最好进行防御性编码。 (顺便说一句,如果你想知道,不,我没有对你投反对票)。
【解决方案2】:

方法 A 不会抛出空指针异常。没有比这两者更好的了。这取决于您是否希望它抛出一个 npe(并且您可能希望在您的整体设计中这样做)。

【讨论】:

  • 我不同意你的看法。如果 string1 可以为 null 但不应为 null,则至少应显式抛出该 NPE,或 IllegalArgumentException 或 IllegalStateException 等。我不会主张将隐式 NPE 设计为显式控制流构造。
【解决方案3】:

方法 B 将因 null string1 上的 NullPointerException 而失败,而方法 A 永远不会抛出这个。一些权威机构要求这种“防御性”编程。他们影响了我去做,尽管它仍然不是自然而然的!

也可以写

if (string1 != null && string1.equals("MyString")) ...

尽管 FindBugs 等工具将此标记为可能的错误,但假设您应该确保 string1 已经非空。 (你能依赖评估的顺序吗?)。

所以有不同的思想流派。

【讨论】:

    【解决方案4】:

    方法 a 不会抛出 NullPointerException,因此非常方便。它也被广泛使用。

    【讨论】:

      【解决方案5】:

      异常用于异常处理,并且比检查错误条件并使用常规逻辑处理它们具有更多开销。如果您已经编程了十年,那么 NPE 是一件令人毛骨悚然的事情,通常表明代码粗心。通过使用 "constant".equals(variable) 来避免它们,阅读并使用您的代码的人会更快乐。

      【讨论】:

        【解决方案6】:

        第二种使用更广泛。两者都不是更好。

        和

        的思路是一样的
        if (1 == x)
        

        但没有具体原因。但出于不同的原因。 (其他人指出的空指针)。

        【讨论】:

        • 这不是真的。如果您不能保证 string1 不为空,则不应在该字符串上使用 equals。因此,以另一种方式执行“some constant”.equals(some_string) 是一种更好的做法。
        • 不一定是“更好的做法”。这取决于用例。
        猜你喜欢
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多