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
}
它的代码仍然少得多(尽管越来越难看)出于各种原因,我认为这是一个难看的黑客行为:
- 它对意外输入不稳定。例如
将返回true-可能不是您想要的。这是我认为最大的问题。即使你开始添加更多的技巧(如最近的编辑中的逗号),那么你仍然要考虑一些令人讨厌的角落案例。(“yes oui ja da”.contains(“”)
- 在一般情况下,它的性能并没有那么好-如果您有中/大量的可能性需要测试,那么您最好检查
或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 + ','))