![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| spbsmile |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 8.7.2011 Репутация: нет Всего: нет |
Здравствуйте!
я не совсем понимаю смысл объявлять метод clon() protected. наверно я не понимаю просто смысл модификатора доступа у protected. если метод объявлен , как протектед, то он виден только для своего класса и для его дочерних? так ? т.е дочерний класс Manager спокойно , может использовать метод clon ( не объявляя его в своем классе), который описан в классе Employee. цитирую Хорстмана : "... Но если в классе Manager будет включено поле, требуещего глубокого копирования , клонирование перестанет выполняться. Нет никакой гарантии, что в подклассе реализован метод clon, корректно решающий поставленную задачу . По этой причине метод clon объявлен , как protected " и еще ... зачем в подклассе нужна реалиация метода clon. зачем его переопределять ? |
|||
|
||||
| Stolzen |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Метод clone очень мутный, лучше его не использовать без причины. И мозги целее останутся.
Ну хотя бы для того, чтобы убрать CloneNotSupportedException. Потом, чтобы возвращать именно нужный класс - без кастования от Object. И главное - если есть поля, которые требуют полного копирования - например, массивы, то нужно явно назначить этому полю новый склонированный массив. А это можно сделать только переопределив clone(). Вот пример переопределения метода clone() из EffectiveJava
Никто вам не мешает в реализации объявить его public. |
||||
|
|||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Это одна из основных причин переопределять его в подклассе - расширить ему область видимости так, чтобы сделать доступным для всех -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| spbsmile |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 8.7.2011 Репутация: нет Всего: нет |
дык , почему у него спецификатор доступа поставлен protected?
|
|||
|
||||
| Stolzen |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Чтобы нельзя было вызвать его, когда не установлен интерфейс-маркер Cloneable. |
|||
|
||||
| Samotnik |
|
||||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
ИМХО, не совсем корректное объяснение. Вопрос, которым задаются программисты годами О причинах можно только догадываться. Метод clone() сам по себе не работает, если класс не имплементирует Cloneable. Видимо по этой причине разработчики решили, что его нужно немного прикрыть, чтобы он не светил, как будто он самостоятельный рабочий метод. На мой взгляд, по этой же причине finalize() также сделали protected, потому что он может вызываться, а может и нет. Если нужно оф объяснение, глянь в исходник Cloneable, там есть пару слов об этом:
|
||||
|
|||||
![]()
|
| Правила форума "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. |