CharSequence
= Schnittstelle
String
= konkrete Umsetzung
Du sagtest:
Konvertieren von einem zum anderen
Es erfolgt keine Konvertierung von String
.
- Jedes
String
Objekt ist ein CharSequence
.
- Jeder
CharSequence
kann eine produzieren String
. Rufen Sie an CharSequence::toString
. Wenn das CharSequence
zufällig a ist String
, gibt die Methode einen Verweis auf ihr eigenes Objekt zurück.
Mit anderen Worten, jeder String
ist ein CharSequence
, aber nicht jeder CharSequence
ist ein String
.
Programmierung auf eine Schnittstelle
Bei der Programmierung in Android werden die meisten Textwerte in CharSequence erwartet.
Warum ist das so? Was ist der Vorteil und was sind die Hauptauswirkungen der Verwendung von CharSequence über String?
Im Allgemeinen ist das Programmieren auf eine Schnittstelle besser als das Programmieren auf konkrete Klassen. Dies bietet Flexibilität, sodass wir zwischen konkreten Implementierungen einer bestimmten Schnittstelle wechseln können, ohne anderen Code zu beschädigen.
Wenn Sie eine API entwickeln , die von verschiedenen Programmierern in verschiedenen Situationen verwendet werden soll, schreiben Sie Ihren Code, um die allgemeinsten Schnittstellen zu erhalten und zu übernehmen. Dies gibt dem aufrufenden Programmierer die Freiheit, verschiedene Implementierungen dieser Schnittstelle zu verwenden, je nachdem, welche Implementierung für ihren jeweiligen Kontext am besten geeignet ist.
Schauen Sie sich beispielsweise das Java Collections Framework an . Wenn Ihr API gibt oder nimmt eine geordnete Sammlung von Objekten, erklären Ihre Methoden wie die Verwendung List
nicht ArrayList
, LinkedList
oder jede andere 3rd-Party - Implementierung List
.
Wenn Sie eine schnelle und schmutzige kleine Methode schreiben, die nur von Ihrem Code an einer bestimmten Stelle verwendet werden soll, anstatt eine API zu schreiben, die an mehreren Stellen verwendet werden soll, müssen Sie sich nicht mit der Verwendung der allgemeineren Benutzeroberfläche befassen, sondern mit einer bestimmten konkreten Klasse. Aber selbst dann tut es weh, die allgemeinste Oberfläche zu verwenden, die Sie können.
Was sind die Hauptunterschiede und welche Probleme werden bei der Verwendung erwartet?
- Mit a
String
wissen Sie, dass Sie einen einzigen Text haben, der vollständig im Gedächtnis bleibt und unveränderlich ist.
- Mit a
CharSequence
wissen Sie nicht, welche Besonderheiten die konkrete Implementierung haben könnte.
Das CharSequence
Objekt kann einen enormen Textblock darstellen und hat daher Auswirkungen auf das Gedächtnis. Oder es können viele Textblöcke separat verfolgt werden, die beim Aufrufen zusammengefügt werden toString
müssen und daher Leistungsprobleme aufweisen. Die Implementierung ruft möglicherweise sogar Text von einem Remotedienst ab und hat daher Auswirkungen auf die Latenz.
und von einem zum anderen konvertieren?
Sie werden im Allgemeinen nicht hin und her konvertieren. A String
ist a CharSequence
. Wenn Ihre Methode deklariert, dass es a benötigt CharSequence
, kann der aufrufende Programmierer ein String
Objekt oder etwas anderes wie ein StringBuffer
oder übergeben StringBuilder
. Der Code Ihrer Methode verwendet einfach alles, was übergeben wird, und ruft eine der CharSequence
Methoden auf.
Die Konvertierung kommt Ihnen am nächsten, wenn Ihr Code eine erhält CharSequence
und Sie wissen, dass Sie eine benötigen String
. Möglicherweise sind Sie mit altem Code verbunden, der in die String
Klasse geschrieben wurde, anstatt in die CharSequence
Schnittstelle geschrieben zu werden. Oder Ihr Code arbeitet intensiv mit dem Text, z. B. wiederholte Schleifen oder andere Analysen. In diesem Fall möchten Sie einen möglichen Leistungstreffer nur einmal ausführen, also rufen Sie im Voraus toString
an. Fahren Sie dann mit Ihrer Arbeit fort, indem Sie einen einzigen Text verwenden, von dem Sie wissen, dass er vollständig im Gedächtnis bleibt.
Verdrehte Geschichte
Beachten Sie die Kommentare zur akzeptierten Antwort . Die CharSequence
Schnittstelle wurde an vorhandenen Klassenstrukturen nachgerüstet, sodass einige wichtige Feinheiten ( equals()
& hashCode()
) vorhanden sind. Beachten Sie die verschiedenen Versionen von Java (1, 2, 4 & 5), die auf den Klassen / Schnittstellen markiert sind - im Laufe der Jahre einiges an Abwanderung. Idealerweise CharSequence
wäre es von Anfang an vorhanden gewesen, aber so ist das Leben.
Mein Klassendiagramm unten kann Ihnen helfen, das Gesamtbild der Zeichenfolgentypen in Java 7/8 zu sehen. Ich bin mir nicht sicher, ob all dies in Android vorhanden ist, aber der Gesamtkontext kann sich für Sie dennoch als nützlich erweisen.