Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ссылки... 
:(
    Опции темы
Alone
Дата 18.12.2003, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



УРА! поборол таки!
рассказываю фсем:

в класс, который предполагается клонировать, надо имплементить интерфейс Cloneable и реализовать его метод clone()
Если в классе встречается поле типа массива, то в реализуемом методе clone() надо
1. создать новый массив
2. в цикле клонируем все элементы массива
3. заменяем поле типа массив новым массивом
4. возвращаем клонированный объект

пример:
Код

public class personRow implements Cloneable {
   
   /** Creates a new instance of personRow */
   public personRow() {
   }
   
   public Object clone() throws CloneNotSupportedException {
       personRow clone=null;
       try {
           clone=(personRow) super.clone();
       } catch (CloneNotSupportedException e) {
           throw new InternalError(e.getMessage());
       }
       
       java.util.List L=new java.util.LinkedList();
       
       for(int k=0; k<eList.size(); k++){
           mailRow oldRow=null;
           oldRow=(mailRow)eList.get(k);
           mailRow newRow=null;
           newRow=(mailRow)oldRow.clone();
       }
       clone.eList=L;
       return clone;
   }
   
   public int pid;
   public String name;
   public java.util.List eList=new java.util.LinkedList();
}


а вот класс, который является элементом массива
Код

public class mailRow implements Cloneable {
   
   /** Creates a new instance of mailRow */
   public mailRow() {
   }
   
   public Object clone() throws CloneNotSupportedException {
       mailRow clone=null;
       try {
           clone=(mailRow) super.clone();
       } catch (CloneNotSupportedException e) {
           throw new InternalError(e.getMessage());
       }
       return clone;
   }
   
   public int id;
   public String s;
}


Теперь если у нас есть объект
personRow a=(personRow)AnyArray.get(i);
Мы смело можем его клонировать!
personRow b=(personRow)a.clone();
smile.gif

Это сообщение отредактировал(а) Alone - 18.12.2003, 14:46


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 18.12.2003, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Так я тебе это и пытался все это время втолковать - надо фактически создать новый объект и честно скопировать все поля. Если поля имеют сложный тип, то надо создавать объект этого типа и опять делать копию. И так далее.
PM MAIL WWW ICQ   Вверх
Alone
Дата 18.12.2003, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Кстати, я опять ошибся sad.gif
класс LinkedList уже имплементит Cloneable, и в нем есть реализация метода clone
Только выполняет он таки "поверхностное" копирование, то бишь лепит ссылку...

Фууух... блин, как тяжко... sad.gif

Это сообщение отредактировал(а) Alone - 18.12.2003, 15:52


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Alone
Дата 18.12.2003, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Цитата(AntonSaburov @ 18.12.2003, 15:10)
Если поля имеют сложный тип, то надо создавать объект этого типа и опять делать копию. И так далее.

Насколько я понял, для этого надо "сложный тип" делать клонируемым.


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 18.12.2003, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата
Насколько я понял, для этого надо "сложный тип" делать клонируемым.


Можно делать, а можно в лоб копировать все. Тут уже как хочешь. Но как ты сам видел многие стандартные JAVA-классы делают "shallow copy" (поверхностная копия). А в твоем случае потребовалось "deep copy" (глубокая копия) (перевод само собой условный).

Вот ты и нарвался. Впрочем это как раз в описании Object.clone() очень подробно расписано.
PM MAIL WWW ICQ   Вверх
Alone
Дата 18.12.2003, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Да я просто в исходник LinkedList глянул smile.gif

Кстати, по ходу дела вопрос.

почему надо делать именно так:
java.util.List myList = new java.util.LinkedList();
а не так:
java.util.LinkedList myList = new java.util.LinkedList();

У?

Почему обявление - интерфейсом, а нью - классом?


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 18.12.2003, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата
почему надо делать именно так:
java.util.List myList = new java.util.LinkedList();
а не так:
java.util.LinkedList myList = new java.util.LinkedList();


new классом - а иначе просто никак.
А вот почему надо делать ?
Я бы сформулировал так - почему так делают ?

Ссылка на интерфейс говорит о том, что мы будем использовать созданный класс только для работы именно с этим интерфейсом. И никак иначе. В таком случае код получается более защищенным и мобильным.

Вдруг ты захочешь использовать для этого интерфейса другой класс ? Просто замени его в операторе new.

И тебе тогда нельзя будет использовать методы созданного объекта, которые он получил от класса. Значит ты получаешь более защищенный код.

Вот вообщем-то основные мысли по этому поводу.

И больше в этом топике вопросы не по теме не надо - против правил не стоит идти

PM MAIL WWW ICQ   Вверх
Alone
Дата 19.12.2003, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



За оффтоп понял, за остальное - спасибо.
Тема в принципе исчерпана.


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.