Menu
Coddy logo textTech

Método clone()

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 43 de 87.

O método clone() cria uma cópia de um objeto. Para usá-lo, sua classe deve implementar a interface Cloneable e substituir o método clone() da classe Object.

public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

Agora você pode criar cópias independentes de objetos:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy é um objeto separado com os mesmos valores

Por padrão, clone() realiza uma cópia superficial, o que significa que copia valores primitivos e referências. Se o seu objeto contiver outros objetos como campos, tanto o original quanto o clone farão referência aos mesmos objetos aninhados. Para obter cópias realmente independentes com objetos aninhados, você precisa implementar uma cópia profunda, clonando também esses objetos aninhados dentro do seu método clone().

challenge icon

Desafio

Fácil

Vamos criar um sistema de gerenciamento de documentos que demonstra a clonagem de objetos. Você criará uma classe Document que pode ser clonada para criar cópias independentes, permitindo que os usuários dupliquem documentos enquanto mantêm o original intacto.

Você organizará seu código em dois arquivos:

  • Document.java: crie uma classe que represente um documento e ofereça suporte à clonagem. Um Document tem três campos privados: title (String), author (String) e version (int). Inclua um construtor para inicializar todos os campos e métodos getter para cada um deles. Adicione também um método setVersion(int version) para atualizar o número da versão.

    Faça sua classe Document implementar a interface Cloneable e sobrescreva o método clone() para retornar um Document. Trate a CloneNotSupportedException dentro do método encapsulando-a em uma RuntimeException.

    Sobrescreva toString() para retornar: Document[title=X, author=Y, version=Z], em que X, Y e Z são os valores reais dos campos.

  • Main.java: dê vida à sua classe Document criando um documento e clonando-o. Você receberá três entradas: um título (String), um autor (String) e um número de versão (int).

    Crie um Document original com esses valores e, em seguida, clone-o para criar uma cópia. Depois da clonagem, modifique a versão da cópia incrementando-a em 1 usando setVersion(). Isso demonstra que o clone é realmente independente do original.

    Imprima três linhas:

    1. Original: seguido pelo toString() do documento original
    2. Clone: seguido pelo toString() do documento clonado
    3. Independent: seguido por true ou false, indicando se o original e o clone são objetos diferentes (use a comparação !=)

Você receberá três entradas: o título do documento (String), o nome do autor (String) e o número de versão (int).

Observe como, depois de modificar a versão do clone, o documento original permanece inalterado. Isso prova que clone() criou uma cópia realmente independente!

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler entradas
        String title = scanner.nextLine();
        String author = scanner.nextLine();
        int version = scanner.nextInt();
        
        // TODO: Crie um Document original com os valores de entrada
        
        // TODO: Clone o documento original para criar uma cópia
        
        // TODO: Modifique a version do clone incrementando-a em 1
        
        // TODO: Imprima "Original: " seguido do documento original
        
        // TODO: Imprima "Clone: " seguido do documento clonado
        
        // TODO: Imprima "Independent: " seguido de true/false (verifique se original != clone)
        
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online