Der Zweck von CharSequence
besteht 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 CharSequence
Benutzeroberflä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 CharSequence
an eine Stream
Schnittstelle an. Da dies Standardmethoden sind, stellen sie keine zusätzlichen Anforderungen für die Implementierung von Klassen CharSequence
.
Der CharSequence
Typ 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 CharSequence
s.
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:
contains
ist 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 nichtcontains
standardmäßig über das Impl implementiert werdenreturn to String().contains(...)
, wodurch die Anforderung für die Implementierung von Klassen entfernt wurde.