Java 字符串包含vs列表<;字符串>;包含

Java 字符串包含vs列表<;字符串>;包含,java,coding-style,contains,Java,Coding Style,Contains,假设您想测试输入是否是几个常量字符串之一,并且忽略性能,那么编码是否是一种反模式: if ("yes oui ja da".contains(answer)) { // answer was in the affirmative } 而不是更传统的: private static List<String> affirmativeAnswers = Arrays.asList("yes", "oui", "

假设您想测试输入是否是几个常量字符串之一,并且忽略性能,那么编码是否是一种反模式:

if ("yes oui ja da".contains(answer)) {
    // answer was in the affirmative
}
而不是更传统的:

private static List<String> affirmativeAnswers = Arrays.asList("yes", "oui", "ja", "da");

if (affirmativeAnswers.contains(answer)) {
    // answer was in the affirmative
}

它的代码仍然少得多(尽管越来越难看)

出于各种原因,我认为这是一个难看的黑客行为:

  • 它对意外输入不稳定。例如
    (“yes oui ja da”.contains(“”)
    将返回true-可能不是您想要的。这是我认为最大的问题。即使你开始添加更多的技巧(如最近的编辑中的逗号),那么你仍然要考虑一些令人讨厌的角落案例。
  • 在一般情况下,它的性能并没有那么好-如果您有中/大量的可能性需要测试,那么您最好检查
    HashMap
    HashSet
    ,后者是
    O(1)
    ,而不是
    O(n)
    来扫描串联字符串
  • 这可能会让没有经验的程序员/未来的维护人员感到困惑。如果你希望你的代码是可维护的,不要使用聪明的技巧
  • 它不适合未来的重构(例如字符串的国际化?在运行时动态改变可能性列表?)

    • 另外,好的,String contains方法使用regex检查子字符串是否是字符串的一部分。与搜索列表(AFAIK)相比,此操作成本较高。所以在我看来,现在最好使用列表,不是吗?;)

      尽可能删除依赖项

      在我看来,这不是最好的做法。最佳实践将允许删除对接受字符串的依赖关系。在本例中,依赖项是字符串的列表。但是,如果将对字符串列表的依赖关系移动到服务或数据库中,则很容易将其集成到接受
      list
      的方法中,因为这是显而易见的,而当尝试集成到只需要
      字符串的方法中时,可能会出现问题

      记住范围

      一如既往,这取决于范围。如果你只需要做一次这件小事,而且它是一个非常小的项目的一部分,那么它真的没有什么区别。然而,如果这是一个不小的项目的一部分,那么如果没有遵守最佳实践,它可能需要重构

      让编译器优化代码


      至于所需的代码量,您不应该对此太担心。更重要的是它的可读性。编译器将使代码尽可能高效,因为这是它的职责。不要试图编写类似于编译器的代码,因为随着更好的方法的出现,编译器将使用它们,而模拟代码将保持不变。

      如果要检查句子中是否存在字符串,则
      string.contains(string)是可行的。

      否则,如果要检查整个字符串是否相等,则,
      列表。包含(字符串)是可行的。

      。。。这是对语言的滥用吗

      “爪哇-他不在乎!!”。但是“哇!!讨厌!!”1

      但说真的,您应该将目标放在使代码易于阅读和维护上。(或表演……如果这很重要的话。)

      使用最少的击键次数来表达某些东西的复杂、晦涩的代码不是上面提到的。这是糟糕的风格。。。即使代码功能正确



      1-如果你在过去一年左右一直生活在岩石下。。。我指的是这个- ReXEX <代码>来搜索一个没有“代码>边界<代码>的特定模式…这不是一个黑客。它是一个错误。我认为它比列表版本更可读,这就是我为什么使用它的原因。occasionally@Bohemian-好的,作为一个1行,我可以看到,但是如果你把它考虑到一个方法中,如果签名接受字符串列表,那么它的可读性会更好。通常,当我发现自己不止一次地使用一个流程时,我会将其转化为一种方法或使用一种设计模式来封装它。这样就没有复制粘贴错误的空间,功能可以在将来扩展,并且易于测试;你可以简单地把它列在广告列表上。contsins(sting)仅供参考,我认为这篇文章很容易阅读。这就是为什么我有时使用它。如果你认为它很容易阅读,为什么你要征求我们的意见??但无论如何,我不同意这一点。只有当你已经使用了,并且能够识别成语时,它才容易阅读。想想其他人在读你的代码……现在回想我的建议,我有点害怕。“另外,好吧,字符串包含方法使用regex…”不,它没有。当然不是。它没有必要这样做
      contains
      只是
      indexOf(…)>-1
      的包装,而且
      indexOf
      也不使用正则表达式。对不起,我的错,我想我把contains和replace all混淆了。谢谢您的更正。@Expressions:Well,yes,
      replaceAll
      使用regex,因为您给它的参数是一个模式字符串。
      if (",yes,oui,ja,da,".contains(',' + answer + ','))