![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Alone |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
УРА! поборол таки!
рассказываю фсем: в класс, который предполагается клонировать, надо имплементить интерфейс Cloneable и реализовать его метод clone() Если в классе встречается поле типа массива, то в реализуемом методе clone() надо 1. создать новый массив 2. в цикле клонируем все элементы массива 3. заменяем поле типа массив новым массивом 4. возвращаем клонированный объект пример:
а вот класс, который является элементом массива
Теперь если у нас есть объект personRow a=(personRow)AnyArray.get(i); Мы смело можем его клонировать! personRow b=(personRow)a.clone(); Это сообщение отредактировал(а) Alone - 18.12.2003, 14:46 -------------------- |
||||
|
|||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Так я тебе это и пытался все это время втолковать - надо фактически создать новый объект и честно скопировать все поля. Если поля имеют сложный тип, то надо создавать объект этого типа и опять делать копию. И так далее.
|
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
Кстати, я опять ошибся
класс LinkedList уже имплементит Cloneable, и в нем есть реализация метода clone Только выполняет он таки "поверхностное" копирование, то бишь лепит ссылку... Фууух... блин, как тяжко... Это сообщение отредактировал(а) Alone - 18.12.2003, 15:52 -------------------- |
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
Насколько я понял, для этого надо "сложный тип" делать клонируемым. -------------------- |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Можно делать, а можно в лоб копировать все. Тут уже как хочешь. Но как ты сам видел многие стандартные JAVA-классы делают "shallow copy" (поверхностная копия). А в твоем случае потребовалось "deep copy" (глубокая копия) (перевод само собой условный). Вот ты и нарвался. Впрочем это как раз в описании Object.clone() очень подробно расписано. |
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
Да я просто в исходник LinkedList глянул
Кстати, по ходу дела вопрос. почему надо делать именно так: java.util.List myList = new java.util.LinkedList(); а не так: java.util.LinkedList myList = new java.util.LinkedList(); У? Почему обявление - интерфейсом, а нью - классом? -------------------- |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
new классом - а иначе просто никак. А вот почему надо делать ? Я бы сформулировал так - почему так делают ? Ссылка на интерфейс говорит о том, что мы будем использовать созданный класс только для работы именно с этим интерфейсом. И никак иначе. В таком случае код получается более защищенным и мобильным. Вдруг ты захочешь использовать для этого интерфейса другой класс ? Просто замени его в операторе new. И тебе тогда нельзя будет использовать методы созданного объекта, которые он получил от класса. Значит ты получаешь более защищенный код. Вот вообщем-то основные мысли по этому поводу. И больше в этом топике вопросы не по теме не надо - против правил не стоит идти |
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
За оффтоп понял, за остальное - спасибо.
Тема в принципе исчерпана. -------------------- |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |