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.contains()
könnte eine Standardmethode sein. Wenn es existiert, sollte es nicht implementiert werden,String#contains
sondern umgekehrt: String sollte die CharSequence-Implementierung verwenden. DascharAt()
ist anders. Es implementiert keinen Suchalgorithmus, es ist ein entscheidender Teil desCharSequence
: Ohne ihn könnte der Inhalt nicht in einen anderen Typ wie kopiert werdenString
. Streams sind ein wesentlicher Bestandteil von Java8, und das Hinzufügen dieser Standardmethoden entspricht dem Hinzufügen zu anderen Schnittstellen wieCollection
.