Clone um objeto em Java

Aryan Tyagi 12 outubro 2023
  1. Use o método direto para clonar um objeto em Java
  2. Use a função clone() para clonar um objeto em Java
  3. Use um construtor de cópia para clonar um objeto em Java
Clone um objeto em Java

A clonagem de objetos é uma técnica para fazer uma duplicata exata de um objeto. Ele cria uma nova instância da classe do objeto atual e preenche todos os seus campos com o conteúdo exato dos campos do objeto atual.

Neste tutorial, clonaremos um objeto em Java.

Use o método direto para clonar um objeto em Java

Neste método, iremos criar um novo objeto e atribuir algum objeto previamente definido como seu valor.

Veja o seguinte exemplo.

public class shallowcopy implements Cloneable {
  int a, b;

  public static void main(String args[]) throws CloneNotSupportedException {
    shallowcopy d = new shallowcopy();
    d.a = 10;
    d.b = 12;
    shallowcopy dtwo = d;

    System.out.println("Original " + d.a);
    System.out.println(d.b);
    System.out.println("Shallow Copy " + dtwo.a);
    System.out.println(dtwo.b);
    d.a = 5;
    System.out.println("Copy after modifying original");
    System.out.println(dtwo.a);
  }
}

Resultado:

Original 10
12
Shallow Copy 10
12
Copy after modifying original
5

No código acima, alteramos o original e vimos as alterações refletidas na cópia criada. Esse clone é chamado de cópia superficial.

Antes de retornar uma nova instância da mesma classe, a cópia superficial produz uma nova instância da mesma classe e copia seus campos. O conteúdo de um objeto é transferido para um novo objeto neste procedimento. No entanto, ambos os objetos referem-se aos mesmos valores, portanto, quaisquer modificações feitas nos objetos vinculados serão refletidas em outros. A classe de objeto tem uma função de clone, bem como capacidade de cópia superficial. A classe de objeto tem uma função de clone, bem como capacidade de cópia superficial.

Use a função clone() para clonar um objeto em Java

Para clonar um objeto, use o método clone() da classe Object. É a maneira mais rápida de duplicar um array.

A classe cujo objeto clone desejamos gerar deve implementar a interface clonável. Se a interface clonável não for implementada, a função clone() lança uma CloneNotSupportedException.

A função clone() elimina a necessidade de processamento adicional ao fazer uma réplica exata de um objeto. Se fizermos isso usando new, vai demorar muito para processar, razão pela qual usamos a clonagem de objetos. Vamos usá-lo para criar uma cópia profunda.

Quando um item é duplicado junto com os objetos aos quais faz referência, é chamado de cópia profunda. Quaisquer alterações feitas na cópia não refletem no original.

Por exemplo,

import java.util.ArrayList;
public class deepcopy implements Cloneable {
  int a, b;

  public Object clone() throws CloneNotSupportedException {
    return (deepcopy) super.clone();
  }
  public static void main(String args[]) throws CloneNotSupportedException {
    deepcopy d = new deepcopy();
    d.a = 10;
    d.b = 12;
    System.out.println("Original " + d.a);
    System.out.println(d.b);
    deepcopy dtwo = (deepcopy) d.clone();
    System.out.println("Deep Copy " + dtwo.a);
    System.out.println(dtwo.b);
    d.a = 5;
    System.out.println("Copy after modifying original");
    System.out.println(dtwo.a);
  }
}

Resultado:

Original 10 12 Deep Copy 10 12 Copy after modifying original 10

No exemplo acima, as alterações feitas no original não são refletidas na cópia em profundidade.

Use um construtor de cópia para clonar um objeto em Java

Um construtor inicializa um objeto de alguma classe. O construtor de cópia pode criar um objeto duplicado de alguma classe.

Veja o código abaixo para ver como inicializar essa classe.

class copycon {
  public String cc;
  public copycon(String s) {
    this.cc = s;
  }
  public copycon(copycon different) {
    this.cc = different.cc; // copy constructor
  }
}
class Main {
  public static void main(String args[]) {
    copycon c1 = new copycon("abc");
    copycon c2 = new copycon(c1);
    System.out.println(c2.cc);
  }
}

Resultado:

abc

Isso não resultaria em clonagem profunda em Java.

Artigo relacionado - Java Object