3

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

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 + ',')) 

它的代码仍然少得多(尽管变得丑陋)

4

5 回答 5

5

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

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

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

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

于 2013-01-02T06:43:13.087 回答
0

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

于 2013-01-02T06:42:14.267 回答
0

尽可能删除依赖项

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

牢记范围

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

让编译器优化代码

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

于 2013-01-02T06:43:10.027 回答
0

...这是对语言的滥用...

“Java——他不在乎!!”。但是“哇!!讨厌!!” 1 .

但说真的,您应该致力于使您的代码易于阅读和易于维护。(或高性能......如果这很重要。)

使用最少的击键次数来表达某些东西的棘手、晦涩的代码不是上述的。这是一种糟糕的风格......即使你得到的代码在功能上是正确的。


1 - 如果你在过去一年左右一直生活在岩石下......我指的是这个 - http://knowyourmeme.com/memes/honey-badger

于 2013-01-02T06:58:11.997 回答