重点CharSequence
是为字符序列提供只读视图,仅此而已。此接口不提供任何字符串操作或搜索方法。这些超出范围。
接口隔离原则建议类型的客户端不应依赖于他们不使用的方法。因此,接口应仅声明最小有用集。如果不同的用例需要不同的方法,则应该有不同的接口。
仅需要字符源的客户端可能不需要搜索方法。
当然有可能过度使用该原理并最终形成一千个小接口。那也不好。因此,CharSequence
接口不仅包含minimum charAt()
和length()
method,还包含与之息息相关的便捷方法subSequence()
。(CharSequence可能可以提供不带字符串副本的子序列视图,这就是为什么应该将其作为实例方法的原因)。指定toString()
是可以的,因为无论如何该方法都将继承Object
。方法chars()
和codePoints()
适应CharSequence
于Stream
接口。由于这些是默认方法,因此它们不对类实现施加其他要求CharSequence
。
CharSequence
当方法需要通用字符源而不指定特定实现时(例如,String vs. CharBuffer vs. StringBuilder),该类型很有用。该String#join()
和String#contains()
方法是用很好的例子CharSequence
秒。
不必CharSequence
提供一种contains()
方法,因为它可以在外部实现。尽管Java不具备C#扩展方法的便利性,但静态方法本质上是一回事。因此,代替boolean Editable#contains(CharSequence needle)
您将有一个static boolean contains(CharSequence haystack, CharSequence needle)
。字符串搜索算法是一个经过充分研究的计算机科学主题。具有不同权衡的不同算法很容易获得。
进一步阅读:
contains
不是突变方法,并且确实存在搜索方法(charAt
),那么这如何应用?另外,“ 因为这些是默认方法,所以它们不对实现CharSequence的类施加其他要求。 ”-无法contains
通过impl作为默认值实现return to String().contains(...)
,从而消除了对实现类的要求吗?