1 / 1 / 2
Регистрация: 04.08.2013
Сообщений: 83
|
|||||||||||
1 | |||||||||||
Метод clone() выдает ошибку30.09.2013, 14:29. Показов 5503. Ответов 43
Метки нет (Все метки)
В общем сначала я переопределяю метод clone():
CloneNotSupportedException =\
0
|
30.09.2013, 14:29 | |
Ответы с готовыми решениями:
43
Каким образом работает метод clone() ? Выдает ошибку метод итераций Метод Synchronize выдает ошибку Метод простой итерации выдает ошибку |
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
|
||||||
30.09.2013, 14:41 | 2 | |||||
Ваш класс, который быть клонированию, должен реализовывать и-с Cloneable.
Т.е. при его создании
1
|
1 / 1 / 2
Регистрация: 04.08.2013
Сообщений: 83
|
||||||
30.09.2013, 14:53 [ТС] | 3 | |||||
я реализовал интерфейс....а род.клас клонировать нужно потому что нужно сделать глубокое клонирование( в классе есть поле которое на объект ссылается):
0
|
1 / 1 / 2
Регистрация: 04.08.2013
Сообщений: 83
|
|
30.09.2013, 15:46 [ТС] | 5 |
так в чем может быть проблема?
0
|
30.09.2013, 15:56 | 6 | |||||
У меня все работает:
1
|
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
|
|
30.09.2013, 16:19 | 7 |
2Gibby:
Поясню свою мысль. При вызове clone() я лично предпочитаю создавать полностью новый объект, в который, через механизм конструкторов (которые отрабатывают ВСЮ цепочку родитель<>) передаются ключевые параметры старого объекта. И как мне кажется, такой метод позволяет избежать вагона трудноуловимых проблем. 2Deodatus: Покажите, пожалуйста, весь свой код, как вызывается, перехватите исключение и покажите вывод printStackTrace()
1
|
1 / 1 / 2
Регистрация: 04.08.2013
Сообщений: 83
|
||||||||||||||||
30.09.2013, 19:35 [ТС] | 8 | |||||||||||||||
STUDENT:
запихнул в try catch и все заработало =\ ..... не понимаю
0
|
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
||||||
30.09.2013, 22:06 | 9 | |||||
уберите throws CloneNotSupportedException с сигнатуры метода и оберните в try - catch конструкции метода clone. ваш класс поддерживает клонирование, да и еще и глубокое! о каких исключениях может идти речь?
другое дело если вы реализируете условное клонирование(когда обьекты вашего класса какбы поддерживают клонирование, но некоторые поля этого класса не поддерживают клонируование) - тут вы обязаны пропускать наружу все CloneNotSupportedException от других обьектов, которые пытаются сделать клонирование. Добавлено через 9 минут есть несколько категорий клонирования:
Добавлено через 9 минут конструктор копирования нужен в С++ по той причине, что там обьекты могут передаватся по значению и создаватся локальные копии обьектов. Таким образов клонирование поддерживается на уровне языка. Когда вы пишите(в с++):
Java работает с ссылками на обьекты. Потому простым присваиванием тут не обойдешься. И потому в java используется именно способ копирования через метод обьекта(тот самый clone())
0
|
30.09.2013, 22:07 | 10 |
Например? Метод, может быть, не самый красивый с точки зрения языка Java, но какие он может проблемы вызвать - затрудняюсь понять. К тому же, насколько я понял, использование super.clone() является общепринятым способом клонирования.
0
|
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
|
30.09.2013, 22:11 | 11 |
это какие такие трудноуловимые проблемы?
Добавлено через 1 минуту вот блин. не успел.
0
|
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
|
||||||
01.10.2013, 09:09 | 13 | |||||
Вы видимо так и не поняли о чем я толкую.
Так вот, я лично считаю, что конструктор копирования необходим и в Java, именно потому, что работает она со ссылками и необходимо обеспечить передачу по значению. И для этого я делаю специальный ПРИВАТНЫЙ конструктор, который создает новый объект, т.е. грубо говоря как раз и описываю тот самый конструктор копирования. Делается это так (самый примитивный пример, на практике все намного сложнее, фактически реализуется полноценная фабрика со своей логикой):
При разработке многопоточных приложений несколько раз раз нарывался на ситуации, когда родительский класс, при clone устраивал передачу по ссылкам содержимого своих структур. Что не удивительно и правильно, потому как коллекции по clone() содержимое сохраняется. И теперь внимание - почувствуйте разницу - переписывать clone в super классе (это если это допустимо) + следить на ним или же сделать один конструктор. Но есть и более худшие ситуации - когда речь идет о абстрактных классах, которые содержат некие структуры, типа коллекций ... тут без этой схемы никак и никуда. Без моей схемы - беда будет
0
|
01.10.2013, 17:12 | 14 |
edwin3d, а зачем тогда вообще Cloneable и clone? Если вы сделали копирующий конструктор - так сделайте его публичным, пусть клиент пользует конструктором. Мне кажется, раз уж вы сделали clone, так надо по-честному ломиться в Object.clone(). А то получается вы в API говорите, что я сделаю клон, а на самом деле втихаря вызываете конструктор или фабрику.
0
|
91 / 91 / 10
Регистрация: 18.05.2013
Сообщений: 265
|
||||||||||||||||
01.10.2013, 17:52 | 15 | |||||||||||||||
http://docs.oracle.com/javase/... lone%28%29
" Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression:
" Эти условия я выполняю, не нарушая API. Читаем дальше: " By convention, the object returned by this method should be independent of this object (which is being cloned). To achieve this independence, it may be necessary to modify one or more fields of the object returned by super.clone before returning it. " Итого - super.clone только один из путей решения. Нет ли запретов, не рекомендаций не делать иначе и т.д. Есть только - типа для достижения это цели Вы можете идти так. Добавлено через 8 минут А теперь сравните задачу сложности сопровождения кода для сложных объектов, где выстраиваете цепочку clone, увязывая это с данными, полями и т.д. и задачей сопровождения все того-же конструктора для класса, который есть единая точка создания объекта при тех или иных раскладах и т.д.
0
|
01.10.2013, 18:07 | 16 | |||||
Вы извращаете смысл фразы. "may be necessary" относится к "to modify", а не к "by super.clone".
А эту часть вы по какой-то причине решили не цитировать:
0
|
01.10.2013, 18:13 | 17 | ||||||||||
я покажу всю суть проблемы на простом примере
1
|
01.10.2013, 18:16 | 18 |
Дык понятно, что любая ссылка на изменяемый объект должна быть заменена ссылкой на клона. Суть вопроса в том, можно ли нарушить конвенцию и реализовать clone с помощью конструктора или фабрики.
0
|
01.10.2013, 18:19 | 19 |
суть клона в том что он идентичен, но независим, способ по конвенции создаёт зависимый инстанс, его можно применять только если все поля класса иммутабельны.
это всё та же проблема deepCopy из массивов, решать её лучше копирующим конструктором, так как в таком случае это вас автоматически спасает от кучи проблем с наследованием и других
1
|
01.10.2013, 18:23 | 20 | |||||
Проблема конструктора или фабрики на самом деле вот в этом:
Запуская в Bar super.clone мы рассчитывали, что он создаст нам экземпляр Bar. А он создал нам экземляр Foo. И мы схватили волшебный ClassCastException на ровном месте.
0
|
01.10.2013, 18:23 | |
01.10.2013, 18:23 | |
Помогаю со студенческими работами здесь
20
Метод Range.Find выдает ошибку Метод вычисляющий значения выдает ошибку компиляции Метод Paste (Excel, OLE) иногда выдает ошибку Выдает ошибку, что метод getPreventDefault является устаревшим Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |