studio programacion para móviles libro edición desarrollo curso aplicaciones java charsequence

java - para - manual de programacion android pdf



Cuándo usar CharSequence en una API (5)

Estoy diseñando una interfaz pública (API) para un paquete. Me pregunto si debería usar CharSequence general en lugar de String . (Estoy hablando principalmente de las interfaces públicas).

¿Hay algún inconveniente de hacerlo? ¿Se considera una buena práctica?

¿Qué hay de usarlo para propósitos de identificador (cuando el valor se compara con un conjunto en un contenedor basado en hash)?


Esto depende de lo que necesite, sin embargo, me gustaría mencionar dos ventajas de String .

De CharSequence :

Cada objeto puede ser implementado por una clase diferente, y no hay garantía de que cada clase sea capaz de probar la igualdad de sus instancias con las de la otra. Por lo tanto, no es apropiado usar instancias arbitrarias de CharSequence como elementos en un conjunto o como claves en un mapa.

Por lo tanto, siempre que necesite un Map o un hashCode confiable / hashCode , debe copiar las instancias en una String (o lo que sea).

Además, creo que CharSequence no menciona explícitamente que las implementaciones deben ser inmutables. Es posible que deba realizar una copia defensiva que puede ralentizar sus implementaciones.


Java CharSequence es una interfaz. Como dice la API, CharSequence se ha implementado en las CharBuffer , Segment , String , StringBuffer , StringBuilder . Entonces, si desea acceder o aceptar su API de todas estas clases, entonces CharSequence es su elección. Si no es así, String es muy bueno para una API pública porque es muy fácil y todos lo saben. Recordar, CharSequence solo le brinda 4 métodos, por lo que si acepta un objeto CharSequence través de un método, entonces su capacidad de manipulación de entrada será limitada.


Puede implementar CharSequence para guardar sus contraseñas, ya que se desaconseja el uso de String para ese propósito. La implementación debe tener un método de eliminación que borre los datos de texto sin formato.


Si un parámetro es conceptualmente una secuencia de caracteres, use CharSequence.

Una cuerda es técnicamente una secuencia de caracteres, pero la mayoría de las veces no pensamos así; una cadena es más atómica / holística, generalmente no nos interesan los caracteres individuales.

Piense en int. Aunque un int es técnicamente una secuencia de bits, generalmente no nos interesan los bits individuales. Manipulamos los ints como cosas atómicas.

Entonces, si el trabajo principal que va a hacer en un parámetro es iterar a través de sus caracteres, use CharSequence. Si va a manipular el parámetro como una cosa atómica, use String.


CharSequence se usa raramente en bibliotecas de propósito general. Por lo general, debe usarse cuando su caso de uso principal es el manejo de cadenas (manipulación, análisis, ...).

En términos generales , puede hacer cualquier cosa con una CharSequence que pueda hacer con una String (trivialmente, ya que puede convertir cada CharSequence en una String ). Pero hay una diferencia importante: CharSequence No se garantiza que una CharSequence sea ​​inmutable! Siempre que maneje una String y la inspeccione en dos momentos diferentes en el tiempo, puede estar seguro de que tendrá el mismo valor en todo momento.

Pero para una CharSequence eso no es necesariamente cierto. Por ejemplo, alguien podría pasar un StringBuilder a tu método y modificarlo mientras haces algo con él , lo que puede romper un montón de código sano.

Considera este pseudocódigo:

public Object frobnicate(CharSequence something) { Object o = getFromCache(something); if (o == null) { o = computeValue(something); putIntoCache(o, something); } return o; }

Esto parece bastante inofensivo y si hubiera usado String aquí, funcionaría principalmente (excepto que tal vez el valor podría calcularse dos veces). Pero si something es un CharSequence entonces su contenido podría cambiar entre la llamada getFromCache y la llamada computeValue . O peor: entre la llamada computeValue y la llamada putIntoCache !

Por lo tanto: solo acepte CharSequence si hay grandes ventajas y conoce los inconvenientes .

Si acepta CharSequence , debe documentar cómo su API maneja los objetos CharSequence mutables. Por ejemplo: "Modificar un argumento mientras el método se ejecuta da como resultado un comportamiento indefinido".