CharSequence
= interfaccia
String
= implementazione concreta
Tu hai detto:
conversione da uno all'altro
Non c'è conversione da String
.
- Ogni
String
oggetto è a CharSequence
.
- Ogni
CharSequence
può produrre a String
. Chiama CharSequence::toString
. Se CharSequence
succede che sia a String
, il metodo restituisce un riferimento al proprio oggetto.
In altre parole, ogni String
è a CharSequence
, ma non tutti CharSequence
sono a String
.
Programmazione su un'interfaccia
Programmando in Android, la maggior parte dei valori di testo è prevista in CharSequence.
Perché? Qual è il vantaggio e quali sono gli impatti principali dell'utilizzo di CharSequence su String?
Generalmente, programmare su un'interfaccia è meglio che programmare su classi concrete. Ciò offre flessibilità, in modo da poter passare da implementazioni concrete di una particolare interfaccia senza rompere altri codici.
Quando si sviluppa un'API per essere utilizzata da vari programmatori in varie situazioni, scrivere il proprio codice per fornire e utilizzare le interfacce più generali possibili. Questo dà al programmatore chiamante la libertà di usare varie implementazioni di quell'interfaccia, qualunque sia la migliore per il loro particolare contesto.
Ad esempio, guarda Java Collections Framework . Se la vostra API dà o prende un insieme ordinato di oggetti, dichiarare i vostri metodi da utilizzare List
, piuttosto che ArrayList
, LinkedList
o qualsiasi altra applicazione di terze parti List
.
Quando si scrive un metodo rapido e sporco da utilizzare solo per il codice in un posto specifico, invece di scrivere un'API da utilizzare in più punti, non è necessario preoccuparsi di utilizzare l'interfaccia più generale piuttosto che un concreto specifico classe. Ma anche allora, fa male usare l'interfaccia più generale che puoi.
Quali sono le principali differenze e quali problemi sono previsti, mentre li si utilizza,
- Con a
String
sai di avere un solo pezzo di testo, interamente in memoria, ed è immutabile.
- Con a
CharSequence
, non sai quali potrebbero essere le caratteristiche particolari dell'implementazione concreta.
L' CharSequence
oggetto potrebbe rappresentare un enorme pezzo di testo e quindi ha implicazioni di memoria. Oppure potrebbero essere molti blocchi di testo tracciati separatamente che dovranno essere uniti insieme quando si chiama toString
e quindi hanno problemi di prestazioni. L'implementazione potrebbe persino recuperare il testo da un servizio remoto e pertanto ha implicazioni sulla latenza.
e la conversione da uno all'altro?
In genere non ti convertirai avanti e indietro. A String
è a CharSequence
. Se il tuo metodo dichiara che richiede un CharSequence
, il programmatore chiamante può passare un String
oggetto o può passare qualcos'altro come un StringBuffer
o StringBuilder
. Il codice del tuo metodo utilizzerà semplicemente tutto ciò che viene passato, chiamando uno dei CharSequence
metodi.
Il risultato più vicino alla conversione è se il codice riceve un CharSequence
e sai di aver bisogno di un String
. Forse stai interfacciando con il vecchio codice scritto in String
classe piuttosto che scritto CharSequence
nell'interfaccia. O forse il tuo codice funzionerà intensamente con il testo, ad esempio ripetutamente in loop o analizzando in altro modo. In tal caso, vuoi subire ogni possibile colpo di prestazione una sola volta, quindi chiami toString
in anticipo. Quindi procedi con il tuo lavoro usando quello che sai essere un singolo pezzo di testo interamente in memoria.
Storia contorta
Nota i commenti fatti sulla risposta accettata . L' CharSequence
interfaccia è stata adattata su strutture di classe esistenti, quindi ci sono alcune sottigliezze importanti ( equals()
& hashCode()
). Notate le varie versioni di Java (1, 2, 4 e 5) taggate sulle classi / interfacce - un bel po 'di churn nel corso degli anni. Idealmente CharSequence
sarebbe stato in atto sin dall'inizio, ma tale è la vita.
Il mio diagramma di classe qui sotto potrebbe aiutarti a vedere il quadro generale dei tipi di stringa in Java 7/8. Non sono sicuro che tutti questi siano presenti in Android, ma il contesto generale potrebbe ancora esserti utile.