Сенс CharSequence
полягає у наданні перегляду символів лише для читання, і це все. Цей інтерфейс не забезпечує жодних методів маніпуляцій із рядками чи пошуку. Це поза сферою застосування.
Принцип розбиття інтерфейсу передбачає, що клієнти типу не повинні залежати від методів, які вони не використовують. Тому інтерфейс повинен оголошувати лише мінімальний корисний набір. Якщо для іншого випадку використання потрібні різні методи, має бути інший інтерфейс.
Клієнт, який потребує лише джерела символів, швидше за все, не потребує методів пошуку.
Звичайно, можна перестаратися з цим Принципом і отримати тисячу маленьких інтерфейсів. Це теж не добре. Таким чином, CharSequence
інтерфейс містить не лише мінімум charAt()
та length()
методи, але й глибоко пов'язаний метод зручності subSequence()
. (CharSequence, ймовірно, може забезпечити подання на підпорядкування без рядкової копії, тому це має бути метод екземпляра). Вказати toString()
все нормально, оскільки цей метод у будь-якому випадку буде успадкований Object
. Методи chars()
та codePoints()
адаптація a 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(...)
, видаливши вимогу для класів для реалізації?