Menu
Coddy logo textTech

Método clone()

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 43 de 87.

El método clone() crea una copia de un objeto. Para usarlo, tu clase debe implementar la interfaz Cloneable y sobrescribir el método clone() de la clase 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);
        }
    }
}

Ahora puedes crear copias independientes de los objetos:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy es un objeto separado con los mismos valores

De forma predeterminada, clone() realiza una copia superficial, lo que significa que copia valores primitivos y referencias. Si tu objeto contiene otros objetos como campos, tanto el original como el clon harán referencia a los mismos objetos anidados. Para obtener copias verdaderamente independientes con objetos anidados, debes implementar una copia profunda clonando también esos objetos anidados dentro de tu método clone().

challenge icon

Desafío

Fácil

Vamos a crear un sistema de gestión de documentos que demuestre la clonación de objetos. Crearás una clase Document que se puede clonar para crear copias independientes, lo que permite a los usuarios duplicar documentos mientras el original permanece intacto.

Organizarás tu código en dos archivos:

  • Document.java: Crea una clase que represente un documento y admita la clonación. Un Document tiene tres campos privados: title (String), author (String) y version (int). Incluye un constructor para inicializar todos los campos y métodos getter para cada uno. Añade también un método setVersion(int version) para actualizar el número de versión.

    Haz que tu clase Document implemente la interfaz Cloneable y sobrescriba el método clone() para devolver un Document. Gestiona la CloneNotSupportedException dentro del método envolviéndola en una RuntimeException.

    Sobrescribe toString() para que devuelva: Document[title=X, author=Y, version=Z], donde X, Y y Z son los valores reales de los campos.

  • Main.java: Pon en funcionamiento tu clase Document creando un documento y clonándolo. Recibirás tres entradas: un título (String), un autor (String) y un número de versión (int).

    Crea un Document original con estos valores y después clónalo para crear una copia. Después de clonarlo, modifica la versión de la copia incrementándola en 1 mediante setVersion(). Esto demuestra que el clon es realmente independiente del original.

    Imprime tres líneas:

    1. Original: seguido del toString() del documento original
    2. Clone: seguido del toString() del documento clonado
    3. Independent: seguido de true o false, indicando si el original y el clon son objetos diferentes (usa la comparación !=)

Recibirás tres entradas: el título del documento (String), el nombre del autor (String) y el número de versión (int).

Observa cómo, después de modificar la versión del clon, el documento original permanece sin cambios. ¡Esto demuestra que clone() creó una copia verdaderamente independiente!

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leer entradas
        String title = scanner.nextLine();
        String author = scanner.nextLine();
        int version = scanner.nextInt();
        
        // TODO: Crea un Document original con los valores de entrada
        
        // TODO: Clona el documento original para crear una copia
        
        // TODO: Modifica la version del clon incrementándola en 1
        
        // TODO: Imprime "Original: " seguido del documento original
        
        // TODO: Imprime "Clone: " seguido del documento clonado
        
        // TODO: Imprime "Independent: " seguido de true/false (comprueba si original != clone)
        
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online