clone-java

Цель метода clone() – клонировать объект, т.е. создать его клон/копию/дубликат.

Когда вызывается метод clone(), то Java-машина создает и возвращает дубликат объекта, у которого вызвали данный метод. Клонирование объекта в классе Object реализовано очень примитивно – при клонировании создается всего один новый объект: просто создается еще один объект и его полям присваиваются значения полей объекта-образца. Если копируемый объект содержит ссылки на другие объекты, то ссылки будут скопированы, дубликаты тех объектов не создаются.

Реализация метода clone() в классе Object по умолчанию:

protected native Object clone() throws CloneNotSupportedException;

Java-машина не знает, какие объекты можно клонировать, а какие нет, к примеру, файлы клонировать нельзя. Поэтому ответственность о полноценном клонировании полностью ложится на плечи разработчика. Тут все было сделано по аналогии с методом equals(), имеется также своеобразный аналог метода hashCode() – это интерфейс Cloneable.

Интерфейс Cloneable – это интерфейс-маркер. Данный интерфейс не содержит никаких методов. Он используется, чтобы маркировать (помечать) некоторые классы. Если разработчик класса считает, что объекты класса можно клонировать, то он помечает класс этим интерфейсом (имплементирует класс от интерфейса Cloneable).

Если разработчика не устраивает стандартная реализация метода clone(), он должен написать свою, которая будет создавать дубликат объекта правильным образом. Для этого нам нужно переопределить (оверрайдить) данный метод. Современные IDE упрощают данный процесс. Горячие клавиши в Intellij Idea от JetBrains позволяет оверрайдить методы комбинацией клавиш Ctrl + O (не забываем возвращать правильное значение, по умолчанию Object).

При вызове метода clone(), Java-машина проверяет, имплементирован ли у объекта интерфейс Cloneable. Если данный интерфейс был имплементирован, то клонирует объект методом clone(), если нет — выкидывает исключение CloneNotSupportedException.