这适用于Java和Android,因为合同是相同的。
CharSequence不定义contains(CharSequence)方法。我似乎找不到原因,包括它将是非常有用的,防止需要调用CharSequence#toString()来检查字符序列。
例如,在Android中,用户被迫调用Editable#toString()来查看它是否包含一系列字符,尽管Editable实现了CharSequence,如果CharSequence定义了contains(CharSequence),则可以避免这种情况。
这个设计选择背后的想法是什么?这是一个潜在的疏忽,还是有设计原因?
发布于 2017-10-22 15:50:49
CharSequence的目的是为字符序列提供只读视图,仅此而已。此接口不提供任何字符串操作或搜索方法。这些都超出了范围。
接口隔离原则建议,类型的客户端不应该依赖于他们不使用的方法。因此,接口应该只声明最小的有用集。如果不同的用例需要不同的方法,则应该有不同的接口。
只需要字符源的客户端可能不需要搜索方法。
当然,过高这个原则并最终得到上千个小接口是可能的。这也不好。因此,CharSequence接口不仅包含最小的charAt()和length()方法,还包含与之密切相关的方便方法subSequence()。( CharSequence很可能在没有字符串副本的情况下向子序列提供视图,这就是为什么这应该是一个实例方法)。指定toString()是可以的,因为该方法无论如何都是从Object继承的。chars()和codePoints()方法使CharSequence与Stream接口相适应。因为这些是默认方法,所以它们不对实现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)。字符串搜索算法是一个研究良好的计算机科学主题。不同的算法具有不同的权衡条件。
进一步读:
https://softwareengineering.stackexchange.com/questions/359528
复制相似问题