4.7 CharSequence als Basistyp *
Bisher kennen wir die Klassen String, StringBuilder und StringBuffer, um Zeichenketten zu speichern und weiterzugeben. Ein String ist ein Wertobjekt und ein wichtiges Hilfsmittel in Programmen, da durch ihn unveränderliche Zeichenkettenwerte repräsentiert werden, während StringBuilder/StringBuffer veränderliche Zeichenfolgen umfassen.
Aber wie sieht es aus, wenn eine Teilzeichenkette gefordert ist, bei der es egal sein soll, ob das Original als String-, StringBuffer oder StringBuilder-Objekt vorliegt? Und was ist, wenn nur lesender Zugriff gestattet sein soll, sodass Veränderungen ausgeschlossen sind? Eine Lösung ist, alles als ein String-Objekt zu erwarten (und das macht die Java-Bibliothek auch). Doch dann müssen die Programmteile, die intern mit StringBuilder/StringBuffer arbeiten, erst einen neuen String konstruieren, und das kostet Ressourcen.
Zum Glück besitzen die Klassen String sowie StringBuilder/StringBuffer einen gemeinsamen Basistyp CharSequence. CharSequence steht für eine unveränderliche, nur lesbare Sequenz von Zeichen (Schnittstellen und Basistypen sowie Implementierungen werden präziser in Abschnitt 5.13, »Schnittstellen«, vorgestellt). Methoden müssen sich also nicht mehr für konkrete Klassen entscheiden, sondern können einfach ein CharSequence-Objekt als Argument akzeptieren oder als Rückgabe weitergeben. Ein String und ein StringBuilder/StringBuffer-Objekt können zwar mehr, als CharSequence vorschreibt, beide lassen sich aber als CharSequence einsetzen, wenn das »Mehr« an Funktionalität nicht benötigt wird.

Abbildung 4.5: Einige implementierende Klassen von der Schnittstelle CharSequence
interface java.lang.CharSequence |
- char charAt(int index)
Liefert das Zeichen an der Stelle index. - int length()
Gibt die Länge der Zeichensequenz zurück. - CharSequence subSequence(int start, int end)
Liefert eine neue CharSequence von start bis end. - String toString()
Gibt einen String der Sequenz zurück. Die Länge des toString()-Strings entspricht genau der Länge der Sequenz.
Beispiel |
Soll eine Methode eine Zeichenkette bekommen und ist die Herkunft egal, so implementieren wir etwa void giveMeAText( CharSequence s ) |
void giveMeAText( String s ) |
Anwendung von CharSequence in String
In den Klassen String und StringBuilder/StringBuffer existiert eine Methode subSequence(), die ein CharSequence-Objekt liefert. Die Signatur ist in beiden Fällen die gleiche. Die Methode macht im Prinzip nichts anderes als ein substring(begin, end).
class java.lang.String implements CharSequence, ... |
- CharSequence subSequence(int beginIndex, int endIndex)
Liefert eine neue Zeichensequenz von String beziehungsweise StringBuffer.
Die Implementierung sieht so aus, dass mit substring() ein neuer Teilstring zurückgeliefert wird. Das ist eine einfache Lösung, aber nicht unbedingt die schnellste. Für String-Objekte ist das Erzeugen von Substrings ziemlich schnell, da die Methode speziell optimiert ist. Da Strings unveränderlich sind, wird einfach das gleiche char-Feld wie im Original-String verwendet, nur eine Verschiebung und ein Längenwert werden angepasst. Zur Optimierung siehe auch den Tuning-Hinweis in Abschnitt 4.4.12.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.