§11 Переопределяйте clone() избирательно. interface Cloneable –Особенность Object.clone() –Уникальность интерфейса.

Презентация:



Advertisements
Похожие презентации
Лекция 2 Наследование Наследование в Java имеет тот же смысл, что и в С++. Однако наследование в Java осуществляется при помощи ключевого слова extends.
Advertisements

§15 Минимизируйте mutability. Признаки immunable класса Не создавайте методов, способных изменить состояние объекта (mutators) Убедитесь, что от класса.
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
Кафедра ЮНЕСКО по НИТ Объектная модель в Java Часть 2. Интерфейсы и внутренние классы, параметры метода.
Создание клонируемых объектов (интерфейс IClonable)
EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,
Принципы объектно-ориентированного программирования Объектная модель Наследование Инкапсуляция Полиморфизм.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
§17 Проектируйте и документируйте наследование или запрещайте его.
Интерфейсы Лекция 4. Реализуйте очередь в виде списка, содержащую комплексные числа Реализуйте методы void Enqueue(Complex с ) – помещает число в очередь.
ОБЪЕКТНО- ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ (ООП) 1.
Ресурсы WPF Два типа ресурсов WPF: объектные ресурсы (object resource) – определенный.NET-объект, который можно использовать многократно; ресурсы сборки.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
«Мир деятельности » Урок 1 Учиться … А что это значит?
Интерфейсы Обобщения ( шаблоны ) Лекция 4. Интерфейсы Обобщения.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Лекция 2: Описание класса 1. Поля 2. Методы 3. Конструкторы.
Обобщения ( шаблоны ) Лекция 5. Тип, метод или интерфейс параметризованный другим типом Обобщенный тип Тип ( класс, структура ), который параметризован.
Лекция 3 Принципы объектно- ориентированного программирования.
Особенности Java. Блок static static { } Создание и уничтожение объектов new – создание объекта finalyze()
Транксрипт:

§11 Переопределяйте clone() избирательно

interface Cloneable –Особенность Object.clone() –Уникальность интерфейса

Стандарт JSE6 - clone() : Создает и возвращает копию объекта. Значение «копия» может зависеть от типа объекта. Это значит x.clone() != x x.clone().getClass() == x.getClass() Обычно, но не обязательно x.clone().equals(x) Копирование объекта обычно влечет создание нового экземпляра класса, но может влечь и копирование внутренних структур. Без вызова конструктора.

Требование к отсутствию вызова конструктора – слишком сильное. Если класс final, clone может возвратить созданный внутри объект. Если вы переопределяете clone() в не final классе, то вам следует возращать объект super.clone() От класса реализующего Cloneable ожидается, что в нем будет корректно работающий clone()

Пример Работает начиная 1.5 Не заставляйте пользователя делать то, что вы можете сделать в библиотеке.

Чем плох такой подход:

По сути, clone() работает как конструктор. Вы должны быть уверены, что он не повредит исходный объект, и правильно устанавливает инварианты клона. Архитектура clone() несовместима с нормальным использованием final полей ссылающимися на изменяемые объекты.

The fix

Better fix

Лучше не реализовывать дополнительную функциональность в clone(), а еще лучше не предоставлять такой возможности вообще. Вместо – используйте конструктор копирования, или фабрику копирования public Yum(Yum yum); public static Yum newInstance(Yum Yum);