¿CharSequence VS cadena en Java?
Al programar en Android, la mayoría de los valores de texto se esperan en formato CharSequence
.
¿Porqué es eso? ¿Cuál es el beneficio y cuáles son los principales impactos del uso CharSequence
excesivo String
?
¿Cuáles son las principales diferencias y qué problemas se esperan al usarlos y al convertir de uno a otro?
Las cadenas son CharSequences , por lo que puedes usar cadenas y no preocuparte. Android simplemente intenta ser útil permitiéndole especificar también otros objetos CharSequence, como StringBuffers.
CharSequence
= interfaz
String
= implementación concreta
CharSequence
es una interfaz .- Varias clases implementan esta interfaz.
String
es una de esas clases, una implementación concreta deCharSequence
.
Usted dijo:
convirtiendo de uno a otro
No hay conversión de String
.
- Cada
String
objeto es unCharSequence
. - Cada uno
CharSequence
puede producir unString
. LlamarCharSequence::toString
. SiCharSequence
resulta ser aString
, entonces el método devuelve una referencia a su propio objeto.
En otras palabras, cada String
es un CharSequence
, pero no cada CharSequence
es un String
.
Programación en una interfaz
Al programar 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?
Generalmente, programar en una interfaz es mejor que programar en clases concretas. Esto genera flexibilidad, por lo que podemos cambiar entre implementaciones concretas de una interfaz particular sin romper otro código.
Al desarrollar una API para que la utilicen varios programadores en diversas situaciones, escriba su código para dar y recibir las interfaces más generales posibles. Esto le da al programador que llama la libertad de utilizar varias implementaciones de esa interfaz, la que sea mejor para su contexto particular.
Por ejemplo, mire el marco de colecciones de Java . Si su API proporciona o recibe una colección ordenada de objetos, declare que sus métodos usan List
en lugar de ArrayList
, LinkedList
o cualquier otra implementación de terceros de List
.
Al escribir un pequeño método rápido y sucio para que su código lo use solo en un lugar específico, en lugar de escribir una API para usarla en múltiples lugares, no necesita molestarse en usar la interfaz más general en lugar de una concreta específica. clase. Pero incluso entonces, duele usar la interfaz más general posible.
¿Cuáles son las principales diferencias y qué problemas se esperan al utilizarlos?
- Con un
String
sabes que tienes un solo fragmento de texto, completamente en la memoria y que es inmutable. - Con a
CharSequence
, no sabes cuáles podrían ser las características particulares de la implementación concreta.
El CharSequence
objeto podría representar una enorme porción de texto y, por lo tanto, tiene implicaciones para la memoria. O pueden haber muchos fragmentos de texto rastreados por separado que deberán unirse cuando llame toString
y, por lo tanto, tengan problemas de rendimiento. La implementación puede incluso recuperar texto de un servicio remoto y, por lo tanto, tiene implicaciones de latencia.
y convertir de uno a otro?
Por lo general, no realizarás conversiones de un lado a otro. A String
es un CharSequence
. Si su método declara que requiere un CharSequence
, el programador que realiza la llamada puede pasar un String
objeto o algo más, como un StringBuffer
o StringBuilder
. El código de su método simplemente usará lo que se pase, llamando a cualquiera de los CharSequence
métodos.
Lo más cerca que estarás de convertir es si tu código recibe un CharSequence
y sabes que necesitas un archivo String
. Quizás esté interactuando con código antiguo escrito en String
la clase en lugar de escrito en la CharSequence
interfaz. O tal vez su código trabaje intensamente con el texto, como bucles repetidos o análisis de otro modo. En ese caso, deseas recibir cualquier posible impacto en el rendimiento solo una vez, por lo que llamas toString
por adelantado. Luego continúa con tu trabajo usando lo que sabes que es un solo fragmento de texto completamente en la memoria.
Historia retorcida
Tenga en cuenta los comentarios realizados sobre la respuesta aceptada . La CharSequence
interfaz se adaptó a las estructuras de clases 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: bastante rotación a lo largo de los años. Lo ideal CharSequence
sería que hubiera estado ahí desde el principio, pero así es la vida.
El siguiente diagrama de clases puede ayudarle 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.
Creo que es mejor utilizar CharSequence. La razón es que String implementa CharSequence, por lo tanto, puede pasar un String a un CharSequence, SIN EMBARGO, no puede pasar un CharSequence a un String, ya que CharSequence no implementa String. ADEMÁS, en Android el EditText.getText()
método devuelve un Editable, que también implementa CharSequence y se puede pasar fácilmente a uno, aunque no fácilmente a un String. ¡CharSequence se encarga de todo!