CharSequence
= interfaz
String
= implementación concreta
Tu dijiste:
convirtiendo de uno a otro
No hay conversión de String
.
- Cada
String
objeto es unCharSequence
.
- Todos
CharSequence
pueden producir a String
. LlamadaCharSequence::toString
. Si el CharSequence
pasa a ser unString
, entonces el método devuelve una referencia a su propio objeto.
En otras palabras, cada String
es un CharSequence
, pero no todos CharSequence
son unString
.
Programando a una interfaz
Programando en Android, la mayoría de los valores de texto se esperan en CharSequence.
¿Porqué es eso? ¿Cuál es el beneficio y cuáles son los principales impactos del uso de CharSequence sobre String?
En general, programar en una interfaz es mejor que programar en clases concretas. Esto proporciona flexibilidad, por lo que podemos cambiar entre implementaciones concretas de una interfaz particular sin romper otro código.
Al desarrollar una API para ser utilizada por varios programadores en diversas situaciones, escriba su código para dar y tomar las interfaces más generales posibles. Esto le da al programador que llama la libertad de usar diversas implementaciones de esa interfaz, la implementación que sea mejor para su contexto particular.
Por ejemplo, mire el Java Collections Framework . Si su API da o toma una colección ordenada de objetos, declarar sus métodos como el uso List
en lugar de ArrayList
, LinkedList
o cualquier otra aplicación de 3 ª parte List
.
Al escribir un pequeño método rápido y sucio para ser usado solo por su código en un lugar específico, en lugar de escribir una API para usar en varios lugares, no necesita molestarse en usar la interfaz más general en lugar de un concreto específico clase. Pero incluso entonces, le duele usar la interfaz más general que pueda.
¿Cuáles son las principales diferencias y qué problemas se esperan al usarlos?
- Con un
String
sabes que tienes una sola pieza de texto, completamente en memoria, y es inmutable.
- Con un
CharSequence
, no sabe cuáles podrían ser las características particulares de la implementación concreta.
El CharSequence
objeto puede representar una enorme porción de texto y, por lo tanto, tiene implicaciones de memoria. O puede haber muchos fragmentos de texto rastreados por separado que necesitarán unirse cuando llame toString
, y por lo tanto tiene problemas de rendimiento. La implementación puede incluso recuperar texto de un servicio remoto y, por lo tanto, tiene implicaciones de latencia.
y convirtiendo de uno a otro?
Por lo general, no se convertirá de un lado a otro. A String
es a CharSequence
. Si su método declara que toma un CharSequence
, el programador que llama puede pasar un String
objeto, o puede pasar algo más como un StringBuffer
o StringBuilder
. El código de su método simplemente usará lo que se haya pasado, llamando a cualquiera de los CharSequence
métodos.
Lo más cerca que estaría de convertir es si su código recibe un CharSequence
y sabe que necesita un String
. Quizás esté interactuando con el código antiguo escrito en la String
clase en lugar de hacerlo en la CharSequence
interfaz. O tal vez su código trabajará intensamente con el texto, como hacer bucles repetidamente o analizar de otro modo. En ese caso, desea recibir cualquier posible golpe de rendimiento solo una vez, por lo que debe llamar toString
por adelantado. Luego, continúe con su trabajo utilizando lo que sabe que es una sola pieza de texto completamente en la memoria.
Historia retorcida
Tenga en cuenta los comentarios realizados en la respuesta aceptada . La CharSequence
interfaz se actualizó en las estructuras de clase existentes, por lo que hay algunas sutilezas importantes ( equals()
& hashCode()
). Observe las diversas versiones de Java (1, 2, 4 y 5) etiquetadas en las clases / interfaces, un poco de abandono a lo largo de los años. Lo ideal CharSequence
sería haber estado en su lugar desde el principio, pero así es la vida.
Mi diagrama de clases a continuación puede ayudarlo a ver el panorama general de los tipos de cadenas en Java 7/8. No estoy seguro de si todos estos están presentes en Android, pero el contexto general aún puede resultarle útil.