Menu
Coddy logo textTech

Метод clone()

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 43 из 87.

Метод clone() создаёт copy object. Чтобы использовать его, ваш class должен implement интерфейс Cloneable и переопределить method clone() из class 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);
        }
    }
}

Теперь можно create независимые копии объектов:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy — это отдельный объект с теми же значениями

По умолчанию clone() выполняет поверхностное копирование, то есть копирует примитивные значения и ссылки. Если ваш объект содержит другие объекты в качестве полей, и original, и клон будут ссылаться на одни и те же вложенные объекты. Для действительно независимых копий с вложенными объектами необходимо реализовать глубокое копирование, также клонируя эти вложенные объекты внутри вашего метода clone().

challenge icon

Задание

Легко

Давайте создадим систему управления документами, демонстрирующую клонирование object. Вы создадите класс Document, который можно клонировать для создания независимых копий, позволяя пользователям дублировать документы, сохраняя original в неизменном виде.

Вы организуете свой код в двух файлах:

  • Document.java: Create class, представляющий документ и поддерживающий клонирование. Document имеет три private fields: title (String), author (String) и version (int). Добавьте constructor для инициализации всех полей и getter methods для каждого из них. Также добавьте setVersion(int version) method для обновления номера версии.

    Сделайте так, чтобы ваш Document class implement интерфейс Cloneable, и переопределите clone() method, чтобы он возвращал Document. Обработайте CloneNotSupportedException внутри метода, обернув его в RuntimeException.

    Переопределите toString(), чтобы он возвращал: Document[title=X, author=Y, version=Z], где X, Y и Z — фактические значения полей.

  • Main.java: Оживите свой Document class, создав документ и клонировав его. Вы получите три входных значения: заголовок (String), автора (String) и номер версии (int).

    Create original Document с этими значениями, затем клонируйте его, чтобы создать copy. После клонирования измените версию copy, увеличив её на 1 с помощью setVersion(). Это демонстрирует, что clone действительно независим от original.

    Выведите три строки:

    1. Original: , за которым следует toString() original документа
    2. Clone: , за которым следует toString() клонированного документа
    3. Independent: , за которым следует true или false, указывающее, являются ли original и clone разными object (используйте сравнение !=)

Вы получите три входных значения: заголовок документа (String), имя автора (String) и номер версии (int).

Обратите внимание, что после изменения версии clone original документ остаётся неизменным. Это доказывает, что clone() создал действительно независимую copy!

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Считать входные данные
        String title = scanner.nextLine();
        String author = scanner.nextLine();
        int version = scanner.nextInt();
        
        // TODO: Создать оригинальный Document с входными значениями
        
        // TODO: Клонировать оригинальный документ для создания копии
        
        // TODO: Изменить version клона, увеличив его на 1
        
        // TODO: Вывести "Original: " с последующим оригинальным документом
        
        // TODO: Вывести "Clone: " с последующим клонированным документом
        
        // TODO: Вывести "Independent: " с последующим true/false (проверить, если original != clone)
        
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Java