O clonagem de objetos é uma maneira de criar uma cópia exata de um objeto. O método clone() da classe Object é usado para clonar um objeto.
O Interface java.lang.Cloneable deve ser implementado pela classe cujo clone do objeto queremos criar. Se não implementarmos a interface Cloneable, o método clone() gera CloneNotSupportedException .
O Método clone() é definido na classe Object. A sintaxe do método clone() é a seguinte:
protected Object clone() throws CloneNotSupportedException
Por que usar o método clone()?
O Método clone() salva a tarefa de processamento extra para criar a cópia exata de um objeto. Se fizermos isso usando a palavra-chave new, levará muito tempo de processamento para ser executado, por isso usamos a clonagem de objetos.
Vantagem da clonagem de objetos
Embora Object.clone() tenha alguns problemas de design, ainda é uma maneira popular e fácil de copiar objetos. A seguir está uma lista de vantagens de usar o método clone():
- Você não precisa escrever códigos longos e repetitivos. Basta usar uma classe abstrata com um método clone() de 4 ou 5 linhas.
- É a forma mais fácil e eficiente de copiar objetos, principalmente se estivermos aplicando em um projeto já desenvolvido ou antigo. Basta definir uma classe pai, implementar Cloneable nela, fornecer a definição do método clone() e a tarefa estará concluída.
- Clone() é a maneira mais rápida de copiar array.
Desvantagem da clonagem de objetos
A seguir está uma lista de algumas desvantagens do método clone():
- Para usar o método Object.clone(), temos que alterar muitas sintaxes em nosso código, como implementar uma interface Cloneable, definir o método clone() e lidar com CloneNotSupportedException e, finalmente, chamar Object.clone() etc.
- Temos que implementar uma interface clonável enquanto ela não contém nenhum método. Só precisamos usá-lo para informar à JVM que podemos executar clone() em nosso objeto.
- Object.clone() é protegido, então temos que fornecer nosso próprio clone() e chamar indiretamente Object.clone() dele.
- Object.clone() não invoca nenhum construtor, portanto não temos nenhum controle sobre a construção do objeto.
- Se você deseja escrever um método clone em uma classe filha, todas as suas superclasses devem definir o método clone() nelas ou herdá-lo de outra classe pai. Caso contrário, a cadeia super.clone() falhará.
- Object.clone() suporta apenas cópia superficial, mas precisaremos substituí-la se precisarmos de clonagem profunda.
Exemplo de método clone() (clonagem de objeto)
Vamos ver o exemplo simples de clonagem de objetos
class Student18 implements Cloneable{ int rollno; String name; Student18(int rollno,String name){ this.rollno=rollno; this.name=name; } public Object clone()throws CloneNotSupportedException{ return super.clone(); } public static void main(String args[]){ try{ Student18 s1=new Student18(101,'amit'); Student18 s2=(Student18)s1.clone(); System.out.println(s1.rollno+' '+s1.name); System.out.println(s2.rollno+' '+s2.name); }catch(CloneNotSupportedException c){} } }Teste agora
Output:101 amit 101 amitbaixe o exemplo de clonagem de objeto
Como você pode ver no exemplo acima, ambas as variáveis de referência têm o mesmo valor. Assim, o clone() copia os valores de um objeto para outro. Portanto, não precisamos escrever código explícito para copiar o valor de um objeto para outro.
Se criarmos outro objeto por meio da palavra-chave new e atribuirmos os valores de outro objeto a este, será necessário muito processamento neste objeto. Portanto, para salvar a tarefa extra de processamento, usamos o método clone().