CharSequence
= interface
String
= mise en œuvre concrète
Tu as dit:
conversion de l'un à l'autre
Il n'y a pas de conversion depuis String
.
- Chaque
String
objet est un CharSequence
.
- Chacun
CharSequence
peut produire un String
. Appelle CharSequence::toString
. Si laCharSequence
se trouve être un String
, la méthode renvoie une référence à son propre objet.
En d'autres termes, tout String
est unCharSequence
, mais pas tout CharSequence
est un String
.
Programmation vers une interface
Programmation sous Android, la plupart des valeurs de texte sont attendues dans CharSequence.
Pourquoi donc? Quel est l'avantage et quels sont les principaux impacts de l'utilisation de CharSequence sur String?
Généralement, la programmation sur une interface est meilleure que la programmation sur des classes concrètes. Cela donne de la flexibilité, nous pouvons donc basculer entre les implémentations concrètes d'une interface particulière sans casser d'autres codes.
Lors du développement d'un API à utiliser par divers programmeurs dans diverses situations, écrivez votre code pour donner et prendre les interfaces les plus générales possibles. Cela donne au programmeur appelant la liberté d'utiliser diverses implémentations de cette interface, selon celle qui convient le mieux à son contexte particulier.
Par exemple, regardez le Java Collections Framework . Si votre API donne ou prend une collection ordonnée d'objets, déclarer vos méthodes que l' utilisation List
plutôt que ArrayList
, LinkedList
ou toute autre mise en œuvre 3ème partie deList
.
Lorsque vous écrivez une petite méthode rapide et sale à utiliser uniquement par votre code à un endroit spécifique, par opposition à l'écriture d'une API à utiliser à plusieurs endroits, vous n'avez pas à vous soucier d'utiliser l'interface plus générale plutôt qu'un béton spécifique classe. Mais même dans ce cas, il est difficile d'utiliser l'interface la plus générale possible.
Quelles sont les principales différences et quels problèmes sont attendus lors de leur utilisation,
- Avec un
String
vous savez que vous avez un seul morceau de texte, entièrement en mémoire, et est immuable.
- Avec a
CharSequence
, vous ne savez pas quelles pourraient être les particularités de l'implémentation concrète.
L' CharSequence
objet peut représenter un énorme morceau de texte, et a donc des implications de mémoire. Ou il peut y avoir de nombreux morceaux de texte suivis séparément qui devront être assemblés lorsque vous appelez toString
, et ont donc des problèmes de performances. L'implémentation peut même récupérer du texte à partir d'un service distant et a donc des implications de latence.
et la conversion de l'un à l'autre?
En général, vous ne vous convertirez pas d'avant en arrière. A String
est un CharSequence
. Si votre méthode déclare qu'il faut un CharSequence
, le programmeur appelant peut passer un String
objet, ou peut passer quelque chose d'autre comme un StringBuffer
ou StringBuilder
. Le code de votre méthode utilisera simplement tout ce qui est passé, appelant l'une des CharSequence
méthodes.
La conversion la plus proche serait si votre code reçoit un CharSequence
et que vous savez que vous en avez besoin String
. Peut-être que vous interfacez avec de l'ancien code écrit en String
classe plutôt qu'en écrit sur l' CharSequence
interface. Ou peut-être que votre code fonctionnera intensément avec le texte, comme une boucle répétée ou une autre analyse. Dans ce cas, vous voulez prendre une seule fois les performances possibles, vous appeleztoString
donc à l'avance. Continuez ensuite votre travail en utilisant ce que vous savez être un seul morceau de texte entièrement en mémoire.
Histoire tordue
Notez les commentaires faits sur la réponse acceptée . L' CharSequence
interface a été adaptée aux structures de classe existantes, il y a donc quelques subtilités importantes ( equals()
& hashCode()
). Remarquez les différentes versions de Java (1, 2, 4 et 5) marquées sur les classes / interfaces, ce qui a beaucoup bougé au fil des ans. Idéalement, CharSequence
il aurait été en place depuis le début, mais telle est la vie.
Mon diagramme de classes ci-dessous peut vous aider à voir la grande image des types de chaînes en Java 7/8. Je ne sais pas si tous ces éléments sont présents dans Android, mais le contexte global peut toujours vous être utile.