Trabalhando com imutabilidade no Java

Sobre Imutabilidade

Pensar em trabalhar com imutabilidade ou alguma outra característica de programação funcional em Java pode parecer estranho para as pessoas que não tem muito contato com a linguagem, mas sim, e possível e existem muitos benefícios em realizar essa pratica.

A imutabilidade na verdade esta presente em uma classe que utilizamos diariamente com o Java, as Strings são classes imutáveis. Ao tentar realizar qualquer alteração em um objeto do tipo String você sempre vai receber como retorno uma nova String, sem alterar o valor original por exemplo:

Não importa o que o método adicionaSobrenome(nome) faça, a saída apresentará ‘Rafael Augusto’. Os objetos imutáveis não sofrem efeitos colaterais, o que é o principal beneficio de se trabalhar com esse tipo de objetos.

Imutabilidade no Java

Trabalhar com objetos imutáveis em Java ainda não e tão simples, existem algumas interfaces que podem ser utilizadas com coleções que tem como objetivo proteger a integridade de seus objetos, fazendo com que os métodos expostos não possibilitem modificações.

Outra forma de realizar esse trabalho é através de cópias defensivas do objeto, devolvendo sempre uma cópia criada, por exemplo, através do método clone. Assim protegendo o objeto original de se afetado.

Criando classe imutável

Para que uma classe seja considerada imutável em java ela deve seguir as seguintes características:

  • Métodos não podem modificar seu estado
  • Definida como final
  • Atributos devem ser privados
  • Atributos devem ser final
  • Caso sua classe tenha composição com objetos mutáveis, eles devem ter acesso exclusivo pela sua classe, devolvendo cópias defensivas

Exemplo de classe imutável no Java:

Essa e uma classe simples, fácil de entender. Agora caso você tenha que trabalhar com objetos mutáveis, sera necessário realizar as cópias defensivas desses objetos como no seguinte exemplo:

Se o objeto não possuir um método clone ou semelhante, sera necessário realizar uma copia manual do objeto para que possamos continuar trabalhando com imutabilidade.

Ainda e um pouco complicado trabalhar com imutabilidade em Java, mas essa pratica traz diversos benefícios como optimização de memoria, cache e thread-safety.