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


Автор: smartchecker 2.10.2013, 12:51
Есть Arraylist из неких объектов.
Код

ArrayList<Triad> triadList = reader.getTriadList();

Мне нужна копия этого list'а, но чтобы в копии были новые объекты, а не ссылки на объекты из первого.
Код

ArrayList<Triad> otherTriadList = new ArrayList<Triad>(triadList);

Не работает.

Означает ли это что я должен написать в Triad копирующий конструктор или ещё что-нибудь?
Как это правильно реализовать?

Автор: danilych 2.10.2013, 13:16
Да, все верно думаете. Нужно создать копию каждого объекта и поместить ее в ArrayList

Автор: smartchecker 2.10.2013, 13:21
Цитата(danilych @ 2.10.2013,  13:16)
Да, все верно думаете. Нужно создать копию каждого объекта и поместить ее в ArrayList

Если объект Triad содержит, ещё и другие самописные объекты, то для них, тоже надо реализовывать копирующие конструкторы?
И есть ли где-нибудь внятный пример, чтобы посмотреть?
Как в итоге будет выглядеть код для копирования ArrayList'а?

Автор: Stolzen 2.10.2013, 13:36
Самым простым решением в вашем случае может быть сереализовать весь список, а потом десереализовать. 

Цитата(smartchecker @  2.10.2013,  14:21 Найти цитируемый пост)
Если объект Triad содержит, ещё и другие самописные объекты, то для них, тоже надо реализовывать копирующие конструкторы?

Да.

Внятный пример можете попробовать поискать в Effective Java, вроде там что-то подобное было в Item-е про clone.

Автор: LSD 2.10.2013, 15:21
Цитата(smartchecker @  2.10.2013,  14:21 Найти цитируемый пост)
Если объект Triad содержит, ещё и другие самописные объекты, то для них, тоже надо реализовывать копирующие конструкторы?

Если они mutable.


В принципе есть техника глубокого копирования через сериализацию, но это неэффективно с точки зрения производительности лучше копирующий конструктор.

Автор: GreenTea22 2.10.2013, 20:43
Можно так же использовать копирование одного обьекта в другой через рефлексию. Как это делает например http://dozer.sourceforge.net/
Но если у вас не большой проект и не хотите заморачиваться с таким монстром как дозер, то самое простое решение написать копирующий конструктор.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//Копирующий-конструктор.-Как-правильно-id524bed3dae2015ce44000000#findElement_E7045_524c5b52ae2015f51c0007da_0

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