CharSequence= interface
String= implementação concreta
Você disse:
convertendo de um para outro
Não há como converter String.
- Todo
Stringobjeto é um CharSequence.
- Todo mundo
CharSequencepode produzir um String. Ligue CharSequence::toString. Se por CharSequenceacaso for a String, o método retornará uma referência ao seu próprio objeto.
Em outras palavras, cada Stringum é 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, LinkedListou 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,
Stringvocê 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 CharSequenceobjeto 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 toStringe, 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 Stringobjeto ou pode passar algo como um StringBufferou StringBuilder. O código do seu método simplesmente usará o que for passado, chamando qualquer um dos CharSequencemétodos.
O mais próximo que você chegaria da conversão é se o seu código receber um CharSequencee você souber que precisa de um String. Talvez você esteja fazendo interface com o código antigo gravado na Stringclasse, em vez de gravado na CharSequenceinterface. 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 toStringcom 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 CharSequenceinterface 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 CharSequenceseria 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ê.
