![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Правильно ли я понимаю, что в общем случае mutable класс желательно должен иметь реализованный метод clone(), чтобы его объекты можно было копировать?
Я хочу сделать несколько классов, каждый из который представлял бы собой составной индекс, то есть, был бы массивом целых чисел. Этот индекс должен будет иметь метод inc, который "увеличивал бы индекс на единицу", то есть, переходил бы к следующему индексу по определённым правилам. Для каждого наследника эти правила были бы свои, а вот основа -- массив целых чисел -- были бы общими. Я определил такой абстрактный класс
Как мне теперь реализовать метод clone()? Можно ли ограничиться реализацией в этом классе так, чтобы в наследниках работало правильно? Должен ли я использовать super.clone() при реализации? |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Вот так правильно?
|
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
На самом деле интересный вопрос...
IDEA подсвечивает с замечанием, что не вызван клон Object'а... Я эе на этом не заморачиваюсь, просто копирую все поля объекта. |
|||
|
||||
sith |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 11.2.2007 Репутация: нет Всего: 1 |
... ты же можешь сам и проверить... написав простой JUnit тест... ты ведь знаешь что должно получиться в результате твоего клонирования... сразу же и увидешь что имешь после выполнения этого кода
-------------------- Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!! |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Да. При желании можно еще поставить try/catch и убрать CloneNotSupportedException. А каким макаром ты создаешь экземпляр объекта? Конструктором, что-ли? ![]() -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
LSD, *CONFUSED*
Нууууу, да. *SHOOT_HIMSELF* Ок, обращусь-ка я к докам за этим вопросом... |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А теперь представь, что кто-то унаследуется от твоего класса. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
А в моём случае в наследниках переопределять clone() уже не будет нужно, как я понимаю. Правильный тип будет обеспечиваться сделанным вызовом super.
Ясно. А если перехватывать исключение, то что делать в обработчике? В каких случаях может возникнуть исключение? Казалось бы, во всех наследниках метод должен работать правильно и исключение не может возникнуть никогда? А мне надо наследникам явно указывать implements Cloneable или они уже все по умолчанию унаследуют это свойство? |
|||
|
||||
sith |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 11.2.2007 Репутация: нет Всего: 1 |
... должны унаследовать... -------------------- Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!! |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Переопределять нужно будет если появятся новые поля и их тоже нужно будет клонировать (не все поля нужно клонировать, не изменяемые объекты клонировать не нужно). Оно может возникнуть, если класс не реализует интерфейс Cloneable, т.е. в твоем случае возникнуть не должно. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
LSD, слава Богу, я клонированием направо и налево не занимаюсь (более того, в России на него мораторий), но в те скудных случаях когда делал его, проблем не возникало.
|
|||
|
||||
ressac |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 25.11.2006 Репутация: нет Всего: 1 |
Я не понимаю почему мы должны ставить возвращаемый тип класса "Object"? А не "CompoundIndex"? Ведь мы приводим super.clone(); к CompoundIndex ? и если честно не вижу разницу между КЛОНИРОВАНИЕ через метод clone() или просто копировать поля через конструктор? |
||||
|
|||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Разница в том, что Object.clone() клонирует любого наследника вашего класса полностью. Будет такая же дрянь, как если бы этот кто-то унаследовался бы от класса, в котором переопределён equals() и hashCode(). Штатная дрянь, так сказать. Я всегда реализую clone() без использования Object.clone(), а тот, кто делает наследников, должен соображать чуть-чуть. Это сообщение отредактировал(а) w1nd - 23.3.2008, 18:00 -------------------- ![]() ![]() |
|||
|
||||
ressac |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 25.11.2006 Репутация: нет Всего: 1 |
w1nd, не много понял из выше сказаного :(
я яву только неделю учу, можно более доступным языком? |
|||
|
||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Вызов B.clone() скопирует и поля, объявленные в классе B. -------------------- ![]() ![]() |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |