Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Копия класса


Автор: ShkVal 19.11.2004, 17:06
Народ подскажите пожалуйста.
Мне надо создать копию класса можно ли это как-то сделать. Или только переопределять clone() и ручками всё переприсваивать. И если в этот класс входят другие классы (т. е. объявлены переменные других классов) для них тоже переопределять clone(). Или всё-таки проще можно взять копии объектов?

Автор: Domestic Cat 19.11.2004, 17:21
Вот клоном и есть проще всего.

Автор: ShkVal 19.11.2004, 17:47
Чепез clone долго и у меня в классе объявлено много ArrayList. Это придётся ещё писать clone() и для объектов которые будут лежать в этих листах.
Может есть другие способы?

Автор: Domestic Cat 19.11.2004, 17:49
Цитата
Чепез clone долго


Как это долго?

Цитата
Может есть другие способы?


Нет.

Автор: ElectricalStorm 19.11.2004, 18:14
клонирование через сериализацию

Автор: Domestic Cat 19.11.2004, 18:25
Цитата
клонирование через сериализацию


... предполагает работу сo стримами, что затормозит все а преимуществ нет - придется возиться с Сериалайзабл и ИО вместо clone(). Не подumal я об этом, правдa.
Добавлено @ 18:27
К тому же не все объекты в java.lang наследуют от Serializable, так что это не самая лучшая идея.

Автор: Zandr 23.11.2004, 08:24
Цитата

public interface Cloneable

A class implements the Cloneable interface to indicate to the Object.clone() method that it is legal for that method to make a field-for-field copy of instances of that class.

Attempts to clone instances that do not implement the Cloneable interface result in the exception CloneNotSupportedException being thrown.

The interface Cloneable declares no methods.


Цитата

Class ArrayList:
...
All Implemented Interfaces:
Cloneable, Collection, List, RandomAccess, Serializable


Cloneable есть у многих стандартных вещей, у которых разумно было его вводить. Будешь переопределять clone() засовывай в декларацию класса, что он Cloneable - на всякий случай.
API Пушкин читать будет?

Автор: polosatij 25.11.2004, 13:57
я тут совсем не в тему влезу smile , но есть вопрос один: (поскольку вы уже эту тему обсуждаете)

Код

Object.clone();


создаст мне действительно копию или просто ссылки на "объекты" (переменные, методы) Object?

если действительно копия: то почему не
Код

Object object= new Object();


это дело вкуса или есть отличия smile

Автор: AntonSaburov 25.11.2004, 16:08
Clone создаст копию всех полей, которые есть у класса. Но вот ссылки будут указывать на те же объекты, что и его предок.

Для Object дествительно по барабану - у него полей никаких нет.

Автор: polosatij 25.11.2004, 16:31
Цитата(AntonSaburov @ 25.11.2004, 16:08)
Для Object дествительно по барабану - у него полей никаких нет.


я имел ввиду : "мойОбъект"..

получается что clone лучше чем

мо= new мойОбъект() ? (если мойОбъект уже существует в памяти) -> имеется ввиду до прихода GC. Или я не прав?

скажи, а через clone я могу переписывать переменные, объекты?
или будет также получаться, как и

Код

p1= new Point(...);
// ...
p2= new Point(...);


smile

надеюсь понятно объяснил smile

Автор: Domestic Cat 25.11.2004, 17:08
Цитата
я имел ввиду : "мойОбъект"..

получается что clone лучше чем

мо= new мойОбъект() ? (если мойОбъект уже существует в памяти) -> имеется ввиду до прихода GC. Или я не прав?


и clone и оператор new создают новый объект, и тут ничего не поделаешь

Автор: AntonSaburov 25.11.2004, 17:31
Цитата(Domestic @ 25.11.2004, 18:08)
и clone и оператор new создают новый объект, и тут ничего не поделаешь

Либо переписать clone так, чтобы возвращалась ссылка на this smile

Автор: Domestic Cat 25.11.2004, 17:38
Цитата
Либо переписать clone так, чтобы возвращалась ссылка на this


Тогда получится ссылка нa тот же самый объekt, что может привести k нехорошим последствиям smile
Ссылку нa тот же самый объекt можнo еще проще получить:

Код

Object o = new Object();
Object o2 = o;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)