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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> метод clone 
:(
    Опции темы
spbsmile
Дата 21.2.2012, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 8.7.2011

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



Здравствуйте!

   я не совсем понимаю смысл объявлять метод clon() protected.
   наверно я не понимаю просто смысл модификатора доступа у protected.
  если метод объявлен , как протектед, то он виден только для своего класса и для его дочерних? так ? 
   т.е дочерний класс Manager спокойно , может использовать метод clon ( не объявляя его в своем классе), который описан в классе Employee. 
  
 цитирую Хорстмана : 
    "... Но если в классе Manager  будет включено поле, требуещего глубокого копирования , клонирование перестанет выполняться. Нет никакой гарантии, что в подклассе реализован 
        метод clon, корректно решающий поставленную задачу . По этой причине метод clon объявлен , как protected "

 и еще ... зачем в подклассе нужна реалиация метода clon. зачем его переопределять ? 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Метод clone очень мутный, лучше его не использовать без причины. И мозги целее останутся. 

Цитата(spbsmile @  21.2.2012,  16:09 Найти цитируемый пост)
 и еще ... зачем в подклассе нужна реалиация метода clon. зачем его переопределять ?

Ну хотя бы для того, чтобы убрать CloneNotSupportedException. Потом, чтобы возвращать именно нужный класс - без кастования от Object. И главное - если есть поля, которые требуют полного копирования - например, массивы, то нужно явно назначить этому полю новый склонированный массив. А это можно сделать только переопределив clone().

Вот пример переопределения метода clone() из EffectiveJava
Код

@Override 
public Stack clone() {
    try {
        Stack result = (Stack) super.clone();
        result.elements = elements.clone();
        return result;
    } catch (CloneNotSupportedException e) {
        throw new AssertionError();
    }
}



Цитата(spbsmile @  21.2.2012,  16:09 Найти цитируемый пост)
   наверно я не понимаю просто смысл модификатора доступа у protected.
  если метод объявлен , как протектед, то он виден только для своего класса и для его дочерних? так ? 
   т.е дочерний класс Manager спокойно , может использовать метод clon ( не объявляя его в своем классе), который описан в классе Employee. 

Никто вам не мешает в реализации объявить его public.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
jk1
Дата 21.2.2012, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

Никто вам не мешает в реализации объявить его public. 


Это одна из основных причин переопределять его в подклассе - расширить ему область видимости так, чтобы сделать доступным для всех


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
spbsmile
Дата 21.2.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 8.7.2011

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



дык , почему у него спецификатор доступа поставлен  protected?
PM MAIL   Вверх
Stolzen
Дата 21.2.2012, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(spbsmile @  21.2.2012,  17:41 Найти цитируемый пост)
дык , почему у него спецификатор доступа поставлен  protected? 

Чтобы нельзя было вызвать его, когда не установлен интерфейс-маркер Cloneable.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Samotnik
Дата 23.2.2012, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(Stolzen @  21.2.2012,  16:47 Найти цитируемый пост)
Чтобы нельзя было вызвать его, когда не установлен интерфейс-маркер Cloneable. 

ИМХО, не совсем корректное объяснение. 
Цитата(spbsmile @  21.2.2012,  16:41 Найти цитируемый пост)
дык , почему у него спецификатор доступа поставлен  protected? 

Вопрос, которым задаются программисты годами smile 
О причинах можно только догадываться.
Метод clone() сам по себе не работает, если класс не имплементирует Cloneable. Видимо по этой причине разработчики решили, что его нужно немного прикрыть, чтобы он не светил, как будто он самостоятельный рабочий метод. На мой взгляд, по этой же причине finalize() также сделали protected, потому что он может вызываться, а может и нет.
Если нужно оф объяснение, глянь в исходник Cloneable, там есть пару слов об этом:
Код

 * By convention, classes that implement this interface should override 
 * <tt>Object.clone</tt> (which is protected) with a public method.
 * See {@link java.lang.Object#clone()} for details on overriding this
 * method.
 * <p>
 * Note that this interface does <i>not</i> contain the <tt>clone</tt> method.
 * Therefore, it is not possible to clone an object merely by virtue of the
 * fact that it implements this interface.  Even if the clone method is invoked
 * reflectively, there is no guarantee that it will succeed.


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

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

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


 




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


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

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