String包含vs List <String>包含

Boh*_*ian 3 java coding-style contains

假设你想测试输入是否是几个常量字符串之一,并忽略性能,它是一个反模式代码:

if ("yes oui ja da".contains(answer)) {
    // answer was in the affirmative
}
Run Code Online (Sandbox Code Playgroud)

而不是更传统的:

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

if (affirmativeAnswers.contains(answer)) {
    // answer was in the affirmative
}
Run Code Online (Sandbox Code Playgroud)

这是一个更少的代码,更容易阅读,但它是一个"黑客"?

编辑:

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

if (",yes,oui,ja,da,".contains(',' + answer + ',')) 
Run Code Online (Sandbox Code Playgroud)

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

mik*_*era 5

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

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