Смысл в CharSequence
том, чтобы предоставить представление только для чтения для последовательности символов, и все. Этот интерфейс не предоставляет никаких манипуляций со строками или методов поиска. Это вне области.
Принцип разделения интерфейса предполагает, что клиенты типа не должны зависеть от методов, которые они не используют. Поэтому интерфейс должен объявлять только минимальный полезный набор. Если для другого варианта использования требуются другие методы, должен быть другой интерфейс.
Клиент, которому нужен только источник символов, вероятно, не нуждается в методах поиска.
Конечно, возможно переусердствовать с этим принципом и получить тысячу маленьких интерфейсов. Это тоже не хорошо. Таким образом, CharSequence
интерфейс не только содержит минимальный charAt()
и length()
методы, но также и глубоко связанный метод удобства subSequence()
. (CharSequence может обеспечить представление подпоследовательности без копирования строки, поэтому это должен быть метод экземпляра). Указание toString()
ОК, потому что этот метод все равно будет унаследован от Object
. Методы chars()
и codePoints()
адаптировать CharSequence
к Stream
интерфейсу. Поскольку это методы по умолчанию, они не накладывают дополнительных требований на реализацию классов CharSequence
.
CharSequence
Типа полезно , когда метод необходим общий источник символов без указания конкретной реализации (например , строка против CharBuffer против 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
быть реализовано по умолчанию через implreturn to String().contains(...)
, устраняя требование к классам для реализации?contains()
может быть методом по умолчанию. Если он существует, он не должен быть реализован в терминах,String#contains
а наоборот: String должен использовать реализацию CharSequence. ЭтоcharAt()
другое. Он не реализует алгоритм поиска, это важная частьCharSequence
: без него содержимое не может быть скопировано в другой тип, напримерString
. Потоки являются важной частью Java8, и добавление этих методов по умолчанию соответствует дополнениям к другим интерфейсам, таким какCollection
.