Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Клонирование объектов


Автор: Sherst 27.3.2006, 21:39
Прочитал следующее:
клонирование объектов применяется в тех случаях, когда в процессе работы метода надо внести изменение в объект, не изменяя при этом внешний объект (исключается возможноть использования дублирующих ссылок).Для создания копии локального объекта используется метод clone().Это protected метод базового класса Object.

Вопрос такой зачем переопределять данный метод в дочерних классах, ведь классы по умолчанию наследуют Object ?

Автор: COVD 27.3.2006, 22:32
А потому что метод класса Object не всегда срабатывает, т.е. он может создать обьект, но установить его значения, равными исходному (а это собственно и есть клонирование, пустой-то обьект легко создать конструктором) не всегда в состоянии. Вот и приходится руками делать. В простых же случаях работает.

Автор: LSD 27.3.2006, 22:37
Цитата(Sherst @ 27.3.2006, 21:39 Найти цитируемый пост)
Вопрос такой зачем переопределять данный метод в дочерних классах, ведь классы по умолчанию наследуют Object ?

1. protected метод может быть вызван либо наследниками либо из того же пакета. Но не любым классом.
2. для удобства программирования, лучше убрать CloneNotSupportedException
3. для осуществления глубокого клонирования (если требуется)
Добавлено @ 22:40
Ну и конечно не забыть про implements Serializable.

Автор: Sherst 27.3.2006, 22:41
Можете привести пример поверхностного и глубокого клонирования ?
Заранее спасибо.

Автор: LSD 27.3.2006, 22:48
Поверхностоное:
Код
public Object clone()
{
  try
  {
    return super.clone();
  }
  catch(CloneNotSupportedException e)
  {
    return null;//doesn't happens
  }
}

Глубокое:
Код
public Object clone()
{
  try
  {
    MyClass obj = (MyClass) super.clone();
    obj.feild1 = (SomeType1)obj.field1.clone();
    obj.feild2 = (SomeType2) obj.field2.clone();
    return obj;
  }
  catch(CloneNotSupportedException e)
  {
    return null;//doesn't happens
  }
}


Что к чему хорошо расписано у Эккеля.

Автор: Sherst 27.3.2006, 23:01
Спасибо за пример.
to LSD обязательно добавляю плюсик, только немного выросту smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)