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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование protected для clone, архитектурное решение 
V
    Опции темы
Entry_N3
  Дата 24.3.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чем вызвано решение объявлять для метода clone в классе Object модификатор доступа protected? Объясните логику, пожалуйста?

Код

protected Object clone() throws CloneNotSupportedException



PM MAIL   Вверх
w1nd
Дата 25.3.2007, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Всё просто - не все классы поддерживают клонирование. Горазод более интересный вопрос - почему этот метод не определён в интерфейсе Cloneable. Видимо, разработчики первой версии решили, что не всякий способен его реализовать smile

Это сообщение отредактировал(а) w1nd - 25.3.2007, 01:27


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
LSD
Дата 25.3.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(w1nd @  25.3.2007,  01:26 Найти цитируемый пост)
 Горазод более интересный вопрос - почему этот метод не определён в интерфейсе Cloneable.

Потому что 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.
PM MAIL WWW   Вверх
Entry_N3
Дата 25.3.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



LSD, откомментируйте тогда, пожалуйста, следующее

Код

        Object o1 = new Object();
        Object o2 = o1.clone(); //МЕТОД is not visible!

PM MAIL   Вверх
LSD
Дата 25.3.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
Entry_N3
Дата 25.3.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @ 25.3.2007,  16:18)
... его можно вызывать только из наследников.

так все от Object наследуется, и? 
PM MAIL   Вверх
LSD
Дата 25.3.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
Entry_N3
Дата 25.3.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



LSD,  smile 
PM MAIL   Вверх
w1nd
Дата 26.3.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Цитата(LSD @ 25.3.2007,  14:06)
Потому что Object не может быть объявлен Cloneable, а метод Object.clone() выполняет основную работу по клонированию.

Об этом и речь - почему-то разработчики java решили, что программеры не смогут реализовывать клонирование сами и всё сделали заранее. А получилось только хуже - путаница и неудобство.

Это сообщение отредактировал(а) w1nd - 26.3.2007, 00:21


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
LSD
Дата 26.3.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(w1nd @  26.3.2007,  00:20 Найти цитируемый пост)
Об этом и речь - почему-то разработчики java решили, что программеры не смогут реализовывать клонирование сами и всё сделали заранее. А получилось только хуже - путаница и неудобство.

Потому что, разработчики не могут создать объект без вызова конструктора, а разработчики 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.
PM MAIL WWW   Вверх
priam220
Дата 29.12.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(w1nd @  25.3.2007,  01:26 Найти цитируемый пост)
Всё просто - не все классы поддерживают клонирование.


w1nd,  это не ответ на поставленный вопрос, - каждый класс, являясь потомком класса Object, наследует  метод clone(), и при необходимости может переопределить clone() и сделать public' ом, при этом попутно избавившись от необходимости ставить маркер Cloneable и обертовать в unchecked exception. 
На сегодняшний момент, я пока не определил точно, почему именно protected, но ответ java_master мне показался наиболее адекватным, кратко:
Цитата

Вопрос того, почему clone() является protected, да еще и кидает исключения, донимает лучшие умы тысячелетия. Моё объяснение этого феномена таково:  clone является protected по той причине, что разработчики jdk дают нам возможность использовать функционал поведения clone по-умолчанию, но при этом не хотят чтобы, опасная и неочевидная семантика поверхностного копирования была по-умолчанию доступна всем пользователям объекта.
 
PM MAIL   Вверх
Старовъръ
Дата 29.12.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
w1nd,  это не ответ на поставленный вопрос, - каждый класс, являясь потомком класса Object, наследует  метод clone(), и при необходимости может переопределить clone()
Ну w1nd о том и говорит, что при необходимости-то они переопределяются, но эта необходимость далеко не всегда нужна. Если класс не поддерживает клонирование, а у него есть публичный clone() - то вот это бы сбивало с толку, потому как нарушается Liskov's Substitutional Principle - метод есть, но вызывать его нельзя. 
А вообще пользоваться clone() не следует - для этого создавайте копирующие конструкторы или статические "фабричные методы".

Это сообщение отредактировал(а) Старовъръ - 29.12.2010, 17:43
PM MAIL WWW   Вверх
priam220
Дата 29.12.2010, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Старовъръ, спасибо, теперь понял, и согласен. А почему не стоит?
скажем, если я сделаю так:

public myClass toClone(){
  return this.clone();
}


то чем это хуже будет "фабричного метода"  или "копирующего конструктора"?

Это сообщение отредактировал(а) priam220 - 29.12.2010, 19:41
PM MAIL   Вверх
priam220
Дата 29.12.2010, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



догадываюсь что поэтому:
Цитата

Из примера видно, что примитивное поле было скопировано и далее существует независимо в исходном и клонированном объектах. Изменение одного не сказывается на другом.

А вот ссылочное поле было скопировано по ссылке, оба объекта ссылаются на один и тот же экземпляр класса Point. Поэтому изменения, происходящие с исходным объектом, сказываются на клонированном.

PM MAIL   Вверх
Старовъръ
Дата 29.12.2010, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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


 




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


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

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