Como implementar cópia superficial e cópia profunda em Java



Este artigo fornecerá a você um conhecimento detalhado e abrangente de Shallow Copy e Deep Copy em Java com exemplos.

A clonagem é um processo de criação de uma réplica ou cópia de objeto, o método clone Java.lang.Object é usado para criar uma cópia ou réplica de um objeto. os objetos java que implementam a interface clonável são elegíveis para usar o método clone. Neste artigo, discutiremos a cópia superficial e a cópia profunda na seguinte ordem:

Criação de cópia de objeto Java

Podemos criar uma réplica ou cópia do objeto java por





1. Criar uma cópia do objeto em um local de memória diferente. Isso é chamado de cópia profunda.

2. Criar uma nova referência que aponta para o mesmo local da memória. Isso também é chamado de cópia superficial.



Cópia Rasa

A implementação padrão do método clone cria uma cópia superficial do objeto de origem, significa que uma nova instância do tipo Object é criada, copia todos os campos para uma nova instância e retorna um novo objeto do tipo ‘Object’. Este objeto precisa ser especificado explicitamente no tipo de objeto do objeto de origem.

Este objeto terá uma cópia exata de todos os campos do objeto de origem, incluindo o tipo primitivo e as referências do objeto. Se o objeto de origem contiver quaisquer referências a outros objetos no campo, então na nova instância terá apenas referências a esses objetos, uma cópia desses objetos não é criada. Isso significa que se fizermos alterações na cópia superficial, as alterações serão refletidas no objeto de origem. Ambas as instâncias não são independentes.

def __init__ em python

O método clone na classe Object é protegido por natureza, então nem todas as classes podem usar o método clone (). Você precisa implementar a interface clonável e substituir o método clone. Se a interface clonável não for implementada, você obterá CloneNotSupportedException.super.clone () retornará uma cópia superficial conforme a implementação na classe Object.



Código para cópia superficial

package com.test class Department {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} classe Employee implementa Cloneable {int id String name Departamento dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Versão padrão do método clone (). Ele cria uma cópia superficial de um objeto. O objeto protegido clone () lança CloneNotSupportedException {return super.clone ()}} public class ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Funcionário emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Criando um clone de emp1 e atribuindo-o a emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Imprimindo a designação de 'emp1' System.out.println (emp1.dept.designation) // Saída: AVP // Alterando a designação de 'emp2' emp2.dept.designation = 'Diretor' // Esta mudança será refletida no Funcionário original 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Resultado:

Output-Shallow-Copy

como ordenar array c ++

No exemplo acima, temos uma classe Employee emp1 que possui três variáveis ​​de classe id (int), name (String) e department (Department).

Nós agora clonamos emp1 para emp2 para criar uma cópia rasa, depois disso mudamos a designação usando o objeto emp2 e verificamos que as mesmas mudanças foram refletidas em emp1 também.


Deep Copy

A cópia profunda de um objeto terá uma cópia exata de todos os campos do objeto de origem como uma cópia rasa, mas ao contrário da cópia sallow se o objeto de origem tiver qualquer referência a objeto como campos, então uma réplica do objeto é criada chamando clone método. Isso significa que os objetos de origem e destino são independentes um do outro. Qualquer alteração feita no objeto clonado não afetará o objeto de origem.

Código para Deep Copy

package com.test class Department implementa Cloneable {String empId String grau String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Versão padrão do clone () método. O objeto protegido clone () lança CloneNotSupportedException {return super.clone ()}} class Employee implementa Cloneable {int id String name Departamento de departamento public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Substituindo o método clone () para criar uma cópia profunda de um objeto. O objeto protegido clone () lança CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Departamento dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Criando um clone de emp1 e atribuindo-o a emp2 emp2 = (Funcionário) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Imprimindo a designação de 'emp1' System.out.println (emp1.dept.designation) // Saída: AVP / / Alterando a designação de 'emp2' emp2.dept.designation = 'Diretor' // Esta alteração será refletida no Funcionário original 'emp1' System.out.println (emp1.dept.designation) // Resultado: AVP}}

Resultado:

No exemplo acima de cópia profunda, ao contrário da cópia superficial, os objetos de origem e de destino são independentes um do outro. Qualquer alteração feita em emp2 não afetará emp1.

Diferença entre cópia superficial e cópia profunda

Cópia Rasa Deep Copy
O objeto clonado e o objeto de origem não são completamente separadosOs objetos clonados e os objetos de origem são completamente independentes uns dos outros.
As alterações feitas na instância clonada afetarão a variável de referência do objeto de origemAs alterações feitas na instância clonada não afetarão a variável de referência do objeto de origem.
A versão padrão do clone é a cópia rasaPara criar uma cópia profunda, precisamos substituir o método clone da classe Object.
A cópia superficial é preferida se as variáveis ​​de classe do objeto são apenas do tipo primitivo como camposUma cópia profunda é preferida se as variáveis ​​de classe do objeto têm referências a outros objetos como campos.
É relativamente rápidoÉ relativamente lento.

Com isso, chegamos ao final do artigo Shallow Copy e Deep Copy. Espero que você tenha entendido as várias diferenças entre os dois.

o que são namespaces em c ++

Confira o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso de certificação e treinamento Java J2EE e SOA da Edureka é projetado para estudantes e profissionais que desejam ser um desenvolvedor Java.

Tem alguma questão para nós? Mencione isso na seção de comentários deste blog “Shallow Copy and Deep Copy” e entraremos em contato com você o mais breve possível.