![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Entry_N3 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 446 Регистрация: 8.2.2007 Репутация: нет Всего: нет |
Чем вызвано решение объявлять для метода clone в классе Object модификатор доступа protected? Объясните логику, пожалуйста?
|
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Всё просто - не все классы поддерживают клонирование. Горазод более интересный вопрос - почему этот метод не определён в интерфейсе Cloneable. Видимо, разработчики первой версии решили, что не всякий способен его реализовать
Это сообщение отредактировал(а) w1nd - 25.3.2007, 01:27 -------------------- ![]() ![]() |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Потому что Object не может быть объявлен Cloneable, а метод Object.clone() выполняет основную работу по клонированию. -------------------- 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. |
|||
|
||||
| Entry_N3 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 446 Регистрация: 8.2.2007 Репутация: нет Всего: нет |
LSD, откомментируйте тогда, пожалуйста, следующее
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А что тут комментировать. Метод clone() не является public, поэтому просто так его вызвать нельзя, его можно вызывать только из наследников.
-------------------- 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. |
|||
|
||||
| Entry_N3 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 446 Регистрация: 8.2.2007 Репутация: нет Всего: нет |
так все от Object наследуется, и? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Да, но вызывать protected метод можно только для наследников. Т.е. если A и B унаследованы от Object, то A не сможет вызвать protected метод B.
Вообщем это долго объяснять, если найду подробное объяснение, то выложу. -------------------- 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. |
|||
|
||||
| Entry_N3 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 446 Регистрация: 8.2.2007 Репутация: нет Всего: нет |
LSD,
|
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Об этом и речь - почему-то разработчики java решили, что программеры не смогут реализовывать клонирование сами и всё сделали заранее. А получилось только хуже - путаница и неудобство. Это сообщение отредактировал(а) w1nd - 26.3.2007, 00:21 -------------------- ![]() ![]() |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Потому что, разработчики не могут создать объект без вызова конструктора, а разработчики JVM могут. Ну и плюс все поля им скопировать проще, чем разработчику (добавил поле - надо переписывать метод clone()). -------------------- 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. |
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
w1nd, это не ответ на поставленный вопрос, - каждый класс, являясь потомком класса Object, наследует метод clone(), и при необходимости может переопределить clone() и сделать public' ом, при этом попутно избавившись от необходимости ставить маркер Cloneable и обертовать в unchecked exception. На сегодняшний момент, я пока не определил точно, почему именно protected, но ответ java_master мне показался наиболее адекватным, кратко:
|
|||
|
||||
| Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 4 Всего: 10 |
А вообще пользоваться clone() не следует - для этого создавайте копирующие конструкторы или статические "фабричные методы". Это сообщение отредактировал(а) Старовъръ - 29.12.2010, 17:43 -------------------- |
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Старовъръ, спасибо, теперь понял, и согласен. А почему не стоит?
скажем, если я сделаю так: public myClass toClone(){ return this.clone(); } то чем это хуже будет "фабричного метода" или "копирующего конструктора"? Это сообщение отредактировал(а) priam220 - 29.12.2010, 19:41 |
|||
|
||||
| priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
догадываюсь что поэтому:
|
|||
|
||||
| Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 4 Всего: 10 |
Да, поверхностного клонирования обычно не достаточно - часто нужно глубокое клонирование, а для этого нужно реализовывать clone() по-своему.
Использовать же этот метод не очень хорошо потому, что так просто не привыкли и это менее наглядно, нежели копирующий конструктор. -------------------- |
|||
|
||||
![]()
|
| Правила форума "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. |