首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CharSequence定义包含(CharSequence)?

为什么CharSequence定义包含(CharSequence)?
EN

Software Engineering用户
提问于 2017-10-21 22:39:55
回答 1查看 2.8K关注 0票数 11

这适用于Java和Android,因为合同是相同的。

CharSequence不定义contains(CharSequence)方法。我似乎找不到原因,包括它将是非常有用的,防止需要调用CharSequence#toString()来检查字符序列。

例如,在Android中,用户被迫调用Editable#toString()来查看它是否包含一系列字符,尽管Editable实现了CharSequence,如果CharSequence定义了contains(CharSequence),则可以避免这种情况。

这个设计选择背后的想法是什么?这是一个潜在的疏忽,还是有设计原因?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2017-10-22 15:50:49

CharSequence的目的是为字符序列提供只读视图,仅此而已。此接口不提供任何字符串操作或搜索方法。这些都超出了范围。

接口隔离原则建议,类型的客户端不应该依赖于他们不使用的方法。因此,接口应该只声明最小的有用集。如果不同的用例需要不同的方法,则应该有不同的接口。

只需要字符源的客户端可能不需要搜索方法。

当然,过高这个原则并最终得到上千个小接口是可能的。这也不好。因此,CharSequence接口不仅包含最小的charAt()length()方法,还包含与之密切相关的方便方法subSequence()。( CharSequence很可能在没有字符串副本的情况下向子序列提供视图,这就是为什么这应该是一个实例方法)。指定toString()是可以的,因为该方法无论如何都是从Object继承的。chars()codePoints()方法使CharSequenceStream接口相适应。因为这些是默认方法,所以它们不对实现CharSequence的类施加额外的要求。

当方法需要泛型字符源而不指定特定实现时,CharSequence类型非常有用(例如,String is与StringBuilder)。String#join()String#contains()方法是使用CharSequences的很好的例子。

CharSequence不需要提供contains()方法,因为它可以在外部实现。虽然Java没有C‘S扩展方法的方便,但静态方法本质上是一回事。因此,与boolean Editable#contains(CharSequence needle)不同,您将拥有一个static boolean contains(CharSequence haystack, CharSequence needle)字符串搜索算法是一个研究良好的计算机科学主题。不同的算法具有不同的权衡条件。

进一步读:

票数 10
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/359528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档