Back-End

26 nov, 2012

Imutabilidade de Strings em Java

Publicidade

Já abordei em outro artigo, no Jornal Java, sobre a imutabilidade de Strings ser um fator que não participa da orientação a objetos. Neste artigo, iremos abordar um pouco mais essa característica. Quais são os benefícios dessa imutabilidade, por que nós usamos, e em quais cenários devem ser usados.

Estamos partindo do pressuposto de que todos já sabem o que é String pool e conhecem a diferença entre String e StringBuffer, e StringBuffer e StringBuilder. Caso queiram que fale mais sobre esses assuntos, basta colocarem nos comentários que providenciarei.

Pode haver várias respostas para o fato de Strings serem imutáveis, e algumas apenas os designers da classe String poderiam nos responder, porém, duas respostas fazem sentido.

1) Imagine a utilização de String Pool sem a imutabilidade de Strings. Não seria possível, pois em muitos casos uma mesma String literal “Teste” terá sido referenciada por várias variáveis de referência, portanto, se uma delas for alterada, todos os outros valores serão automaticamente afetados, por exemplo:

String A = “Teste”
String B = “Teste”

Agora, chamando o método Teste.toUpperCase(), mudaria o mesmo objeto “Teste” para “TESTE”, então o objeto “B” passaria a ser “TESTE” também, afetando dessa forma outros objetos indesejáveis.

2) Strings são utilizadas como parâmetro para várias classes Java, como por exemplo para abrir conexões passando o host e a porta como strings. Outro exemplo é abrir um arquivo passando o nome do arquivo como argumento para a classe File e, por último, abrir conexão com o banco de dados passando a URL do banco de dados como uma string.

Se não fosse a imutabilidade de Strings, isso seria um sério problema de segurança. Imagine, por exemplo, que qualquer um poderia abrir qualquer arquivo a que tivesse acesso e alterar sem querer ou por querer o nome do arquivo e garantir acesso a ele.

Já que Strings são imutáveis, podem ser perfeitamente compartilhadas entre várias threads, o que é muito importante para programação multithreading.

Acredito que esses argumentos são suficientes para justificar a existência dessa abordagem, mesmo que abra mão da Orientação a Objetos para isso.

Fonte:
http://javarevisited.blogspot.com/2010/10/why-string-is-immutable-in-java.html