Главная » Java » Стратегии клонирования Java

0

 

приступая к созданию метода clone какого-либо класса, следует принять к сведению следующие важные соображения.

 

·      Существует пустой интерфейс Cloneable, который необходимо реализовать, чтобы создать метод clone для клонирования объектов класса.1

 

·      Метод clone реализован в классе Object и поддерживает функции простого клонирования путем копирования всех полей исходного объекта в объект-копию; метод вполне работоспособен во многих ситуациях, но не исключено, что при определенных обстоятельствах вам придется его Переопределить и дополнить.

 

·      В случае, когда метод clone класса вызывается, но при этом не поддерживается, выбрасывается объект исключения типа CloneNotSupportedException.

 

Конкретный класс может относиться к одной из четырех различных категорий в зависимости от обеспечиваемого уровня поддержки функций клонирования.

 

·      Поддержка клонирования. Класс реализует (implements) интерфейс Cloneable и объявляет метод сlопе, не предусматривающий исключений.

 

·      Условная поддержка клонирования. В качестве примера можно привести класс коллекции, который сам по себе допускает возможность клонирования, но ее нельзя успешно реализовать, пока не будут нормально клонироваться объекты-элементы коллекции. Класс такого рода, реализуя интерфейс Cloneable, должен позволить собственному методу clone пропускать любые исключения типа CloneNotSupportedException, которые могут быть получены от других объектов, пытающихся выполнить операцию клонирования. Другой пример – класс может обладать возможностью клонирования, но не требовать ее от всех производных классов.

 

·      Класс поддерживает операцию клонирования, но не декларирует эту возможность явно. Класс не реализует интерфейс Cloneable, но если версия метода clone, унаследованная по умолчанию, действует неправильно, класс предлагает собственный корректный ргоtесtеd-метод clone.

 

·      Запрет клонирования. Класс не реализует интерфейс Cloneable и предлагает вариант переопределенного метода clone, который всегда выбрасывает Исключение типа сloneNotSupportedException.

 

Метод Object.сlone проверяет, реализован ли в классе, которому принадлежит текущий объект, интерфейс Cloneable, и выбрасывает исключение типа СloneNotsupportedException, если ответ отрицателен. В противном случае методом создается новый объект того же типа, что и текущий, и полям этого

_____________

1

               Слово Cloneable, строго говоря, следовало бы правильно писать как Clonable – надеемся, в будущих реализациях Java SDK эта ошибка будет исправлена.

 

объекта присваиваются такие же значения, какие хранятся в полях объекта-оригинала. По завершении работы метод Object. clone возвращает ссылку на созданный объект-копию.

Простейший способ обеспечения возможности клонирования состоит в Следующем: необходимо явно оговорить, что класс реализует интерфейс Cloneable, и переопределить метод clone, снабдив его заголовок модификатором publiс:

 

public class Myclass extends BaseClass implements Cloneable {

public Object clone() throws CloneNotSupportedException {

 return super.clone();

}

// …

}

Теперь любой код способен создать клонированный объект класса Mусlass. В этом простейшем случае метод Object. сlone копирует в новый объект класса MуСlass все его поля и возвращает указатель на объект-копию.

Объявление метода Clone в составе класса Object содержит предложение throws CloneNotSupportedException. Это значит, что класс вправе декларировать способность к клонированию, реализуя интерфейс Cloneable, но не обеспечивать ее в действительности. В объявлении класса такая особенность оговаривается посредством определения новой версии метода clone, в которой исключение типа cloneNotSupportedException генерируется всегда. Будьте внимательны – наличие в объявлении класса упоминания о том, ЧТО он реализует интерфейс Cloneable, вовсе не гарантирует, что объекты этого класса могут быть клонированы; некоторые классы, которые реально не поддерживают операции клонирования, сообщают об этом на этапе выполнения приложения, выбрасывая исключение.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии