Интерфейс java.lang.Cloneable — копирование объектов в Java

У объекта java.lang.Object есть метод protected Object clone() throws CloneNotSupportedException. Этот метод позволяет создавать копии объектов. Он бросает исключение CloneNotSupportedException для всех объектов, которые не реализуют интерфейс java.lang.Cloneable,  а для классов, реализующих этот интерфейс, возвращает копию объекта, которая создана копированием всех полей исходного объекта. Содержимое полей не копируется. Если поле является ссылочным, то оно будет указывать на тот же самый объект, что и исходное поле.

Во многих случаях простого копирования недостаточно, так как некоторые поля могут содержать сложные структуры, для которых нужно создать копию, чтобы объекты были действительно независимы. А они должны быть независимы, так как это копирование. Тогда нужно будет переопределить метод копирования своим методом, вызвать super.clone() и создать копии структур для тех полей, которые содержат эти сложные изменяемые структуры. Массивы уже реализуют интерфейс java.lang.Cloneable.

Пример класса, реализующего интерфейс java.lang.Cloneable:

Код выше будем иметь примерно такой вывод в консоль:

 

Интерфейс java.lang.Cloneable — копирование объектов в Java: 2 комментария

  1. Здравствуйте! Вы пишете в статье, что «Содержимое полей не копируется.» А затем в примере можно увидеть, что копируется, так как содержимое полей a и clon1 совпадает. Поясните, пожалуйста, этот момент

    1. Здравствуйте, Маргарита. В этой статье имеется в виду, что если мы делаем класс implements Cloneable, то метод clone будет создавать копию, но без уровней вложенности. Для полей примитивных типов (int, double и т. д.) это не имеет значения, но если поле ссылается на другой класс, то копия экземпляра другого класса создаваться не будет, будет копироваться только сама ссылка. Созданный клон объекта и исходный объект в этом поле будут ссылаться на один и тот же класс.

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

Добавить комментарий

Ваш адрес email не будет опубликован.