字符串包含vs List <string>包含</string>

时间:2013-01-02 06:30:10

标签: 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", "ja", "da");

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

代码少得多,阅读也比较容易,但它是“黑客”吗?

编辑:

为了更安全,如果您担心部分匹配,可以将其编码为:

if (",yes,oui,ja,da,".contains(',' + answer + ',')) 

仍然更少的代码(虽然变得丑陋)

5 个答案:

答案 0 :(得分:5)

出于各种原因,我认为这是一个丑陋的黑客:

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

答案 1 :(得分:1)

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

否则,如果你想检查整个字符串的相等性,那么,
list.contains(string)是可行的。

答案 2 :(得分:0)

另外,AFAIK,String contains方法使用正则表达式来检查子字符串是否是字符串的一部分。与搜索列表(AFAIK)相比,此操作很昂贵。所以IMO,现在最好使用一个列表,不是吗? ;)

答案 3 :(得分:0)

尽可能删除依赖项

在我看来,这不是最佳做法。最佳实践将允许删除对接受字符串的依赖性。在这种情况下,依赖项是此("yes", "oui", "ja", "da")字符串列表。但是,如果要将字符串列表的依赖关系移动到服务或数据库,那么很容易将其集成到接受List<string>的方法中,因为它很明显,而在尝试时可能会出现问题集成到一个只需要string

的方法中

牢记范围

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

让编译器优化代码

关于代码量,您不必过于担心。更重要的是它是可读的。编译器将使代码尽可能高效,因为这是它的职责。不要尝试编写类似于编译器的代码,因为随着更好的方法出现,编译器将使用它们,而模拟代码将保持不变。

答案 4 :(得分:0)

  

......这是滥用语言......

“Java - 他不在乎!!”。但是“Eww !! Nasty !!” 1

但严重的是,您应该致力于使您的代码易于阅读和易于维护。 (或者表现得很好......如果重要的话。)

使用最少的击键次数表达某些东西的棘手的,模糊的代码不是上述的。这是糟糕的风格......即使你的代码在功能上是正确的。


1 - 如果你过去一年左右一直生活在岩石之下......我暗指 - http://knowyourmeme.com/memes/honey-badger。功能