Clonando objetos Java

O processo de clonagem de um objeto significa criar uma cópia exata de um objeto na memória. Ok, não é tão simples. Na verdade, apenas dizer algo como “(objeto) a é um clone de (objeto) b” pode ser perigosamente impreciso. Então, vamos analisar isso.

Cenário

Basicamente, existem dois tipos de clonagem:

  • Cópia superficial

  • Cópia profunda

Qual é a diferença entre esses dois mecanismos de clonagem? Primeiro, temos que pensar um objeto como uma árvore de referências. Por exemplo, poderíamos ter um objeto Employee, que TEM A: Billing, referências PersonalInfo e um membro String chamado age. Além disso, o objeto Billing é composto por referências às referências Taxes e BaseRate. Como você pode ver, um objeto Employee é, de certa forma, uma árvore de referências a todos os objetos mencionados.

Quando falamos sobre cópia superficial , o que estamos fazendo é criar uma nova instância do tipo de objeto a ser clonado e seus valores de membro. Seguindo o exemplo de Funcionário, o objeto de funcionário clonado terá um membro de idade com o mesmo valor do funcionário original. Além disso, e aqui está o truque, as referências do funcionário clonado serão as mesmas referências do funcionário original. Portanto, se depois de clonar o funcionário alterarmos algo no funcionário clonado, essa alteração afetará o original. Simplesmente porque ambos os objetos contêm as mesmas referências. Como você pode ver, a cópia superficial de um objeto tem suas limitações. E é aí que entra em cena a cópia profunda.

A cópia profunda significa criar toda a árvore de referências do objeto original. Assim, usando clonagem profunda, poderíamos alterar os valores no objeto Billing do objeto clonado sem afetar o original. Simplesmente porque são objetos diferentes. Agora, temos dois objetos Billing na memória, um para cada objeto funcionário.
Existem várias maneiras de implementar a cópia profunda em Java. Vou apresentar uma solução simples, usando serialização, implementada pelo Apache:

Cenário

Para utilizá-lo, basta invocar o método deepClone, passando como parâmetro o objeto que deseja clonar, e será criada uma cópia deste. Internamente, esse método serializará o objeto original e o desserializará para forçar a recriação completa do novo objeto clonado.

Como você pode imaginar, o uso de serialização e desserialização de objetos não é gratuito em termos de desempenho, por isso pode afetá-lo se usarmos esse método de clonagem. Existem outras maneiras (um pouco mais complexas, mas muito mais eficientes de lidar com cópias profundas de objetos. Postarei métodos adicionais de clonagem profunda em um futuro próximo. Fique conectado!