Метод 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().
Задание
ЛегкоДавайте создадим систему управления документами, демонстрирующую клонирование 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.Выведите три строки:
Original:, за которым следует toString() original документаClone:, за которым следует toString() клонированного документа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)
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java