Der Zweck von CharSequencebesteht darin, eine schreibgeschützte Ansicht für eine Zeichenfolge bereitzustellen, und das war's. Diese Schnittstelle bietet keine Methoden zur Manipulation oder Suche von Zeichenfolgen. Diese liegen außerhalb des Anwendungsbereichs.
Das Prinzip der Schnittstellentrennung legt nahe, dass Clients eines Typs nicht von Methoden abhängen sollten, die sie nicht verwenden. Daher sollte eine Schnittstelle nur den minimalen nützlichen Satz deklarieren. Wenn ein anderer Anwendungsfall andere Methoden erfordert, sollte es eine andere Schnittstelle geben.
Ein Client, der nur eine Zeichenquelle benötigt, benötigt wahrscheinlich keine Suchmethoden.
Es ist natürlich möglich, dieses Prinzip zu übertreiben und am Ende tausend kleine Schnittstellen zu erhalten. Das ist auch nicht gut. Die CharSequenceBenutzeroberfläche enthält also nicht nur die Minimal- charAt()und length()Methoden, sondern auch die eng verwandte Convenience-Methode subSequence(). (Eine CharSequence kann wahrscheinlich eine Ansicht auf eine Teilsequenz ohne eine Zeichenfolgenkopie bereitstellen, weshalb dies eine Instanzmethode sein sollte.) Die Angabe toString()ist in Ordnung, da diese Methode ohnehin von geerbt würde Object. Die Methoden chars()und codePoints()passen sich CharSequencean eine StreamSchnittstelle an. Da dies Standardmethoden sind, stellen sie keine zusätzlichen Anforderungen für die Implementierung von Klassen CharSequence.
Der CharSequenceTyp ist nützlich, wenn eine Methode eine generische Zeichenquelle benötigt, ohne eine bestimmte Implementierung anzugeben (z. B. String vs. CharBuffer vs. StringBuilder). Die String#join()und String#contains()Methoden sind gute Beispiele für die Verwendung von CharSequences.
Es ist nicht erforderlich CharSequence, eine contains()Methode bereitzustellen , da diese extern implementiert werden kann. Während Java nicht die Bequemlichkeit der Erweiterungsmethoden von C # bietet, ist eine statische Methode im Wesentlichen dasselbe. Also statt boolean Editable#contains(CharSequence needle)du hättest ein static boolean contains(CharSequence haystack, CharSequence needle). String-Suchalgorithmen sind ein gut untersuchtes Informatik-Thema. Verschiedene Algorithmen mit unterschiedlichen Kompromissen sind leicht verfügbar.
Weiterführende Literatur:
containsist kein Mutationsverfahren, und es ist exist Suchmethoden (charAt), so wie funktioniert dies gilt ?. " Da dies Standardmethoden sind, stellen sie keine zusätzlichen Anforderungen für Klassen, die CharSequence implementieren. " - Konnte nichtcontainsstandardmäßig über das Impl implementiert werdenreturn to String().contains(...), wodurch die Anforderung für die Implementierung von Klassen entfernt wurde.