CharSequence
= interface
String
= implementação concreta
Você disse:
convertendo de um para outro
Não há como converter String
.
- Todo
String
objeto é um CharSequence
.
- Todo mundo
CharSequence
pode produzir um String
. Ligue CharSequence::toString
. Se por CharSequence
acaso for a String
, o método retornará uma referência ao seu próprio objeto.
Em outras palavras, cada String
um é um CharSequence
, mas nem todo CharSequence
é um String
.
Programação para uma interface
Ao programar no Android, a maioria dos valores de texto é esperada no CharSequence.
Por que é que? Qual é o benefício e quais são os principais impactos do uso de CharSequence sobre String?
Geralmente, programar para uma interface é melhor do que programar para classes concretas. Isso gera flexibilidade, para que possamos alternar entre implementações concretas de uma interface específica sem quebrar outro código.
Ao desenvolver uma API para ser usada por vários programadores em várias situações, escreva seu código para fornecer e receber as interfaces mais gerais possíveis. Isso dá ao programador chamador a liberdade de usar várias implementações dessa interface, o que for melhor para o seu contexto particular.
Por exemplo, veja o Java Collections Framework . Se a sua API dá ou toma uma coleção ordenada de objetos, declarar seus métodos como a utilização List
, em vez de ArrayList
, LinkedList
ou qualquer outra aplicação 3-parte de List
.
Ao escrever um pequeno método rápido e sujo para ser usado apenas pelo seu código em um local específico, em vez de escrever uma API para ser usada em vários locais, você não precisa se preocupar em usar a interface mais geral em vez de um concreto específico classe. Mas, mesmo assim, é demais usar a interface mais geral possível.
Quais são as principais diferenças e quais problemas são esperados ao usá-los,
- Com um,
String
você sabe que possui um único pedaço de texto, inteiramente na memória e é imutável.
- Com a
CharSequence
, você não sabe quais podem ser os recursos específicos da implementação concreta.
O CharSequence
objeto pode representar um pedaço enorme de texto e, portanto, tem implicações de memória. Ou pode haver muitos pedaços de texto rastreados separadamente que precisarão ser agrupados quando você ligar toString
e, portanto, apresentar problemas de desempenho. A implementação pode até estar recuperando texto de um serviço remoto e, portanto, tem implicações de latência.
e convertendo de um para outro?
Você geralmente não estará convertendo para frente e para trás. A String
é a CharSequence
. Se o seu método declarar que é necessário a CharSequence
, o programador de chamada pode passar um String
objeto ou pode passar algo como um StringBuffer
ou StringBuilder
. O código do seu método simplesmente usará o que for passado, chamando qualquer um dos CharSequence
métodos.
O mais próximo que você chegaria da conversão é se o seu código receber um CharSequence
e você souber que precisa de um String
. Talvez você esteja fazendo interface com o código antigo gravado na String
classe, em vez de gravado na CharSequence
interface. Ou talvez seu código funcione intensivamente com o texto, como repetir repetidamente ou analisar de outra forma. Nesse caso, você deseja obter qualquer resultado de desempenho possível apenas uma vez, para ligar toString
com antecedência. Em seguida, continue seu trabalho usando o que você sabe ser um único pedaço de texto inteiramente na memória.
História distorcida
Observe os comentários feitos na resposta aceita . A CharSequence
interface foi adaptada às estruturas de classes existentes, portanto, existem algumas sutilezas importantes ( equals()
& hashCode()
). Observe as várias versões do Java (1, 2, 4 e 5) marcadas nas classes / interfaces - um pouco de agitação ao longo dos anos. O ideal CharSequence
seria estar em vigor desde o início, mas essa é a vida.
Meu diagrama de classes abaixo pode ajudá-lo a ver o panorama geral dos tipos de string no Java 7/8. Não tenho certeza se todos eles estão presentes no Android, mas o contexto geral ainda pode ser útil para você.