Копировать содержимое из объекта в другой, не имея той же ссылки на объект, в Java - PullRequest
3 голосов
/ 12 января 2012

Мне нужно скопировать два объекта (которые оба являются стеками).

Я хочу скопировать содержимое временного объекта в текущий объект, а затем очистить содержимое временного объекта.

Например,с деревом это будет что-то вроде:

tree = tempTree;
tempTree.clear();

Но ссылка на дерево теперь указывает на temptree, и если я очищу temptree, она также очистит дерево.Я посмотрел другие посты, в которых говорилось о клонируемых реализациях или о конструкторе копирования, и я уверен, что в Java есть лучший способ копирования объектов.

Кстати, мои объекты - это объекты Stack.

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

Ответы [ 4 ]

1 голос
/ 12 января 2012

К сожалению, вам придется кодировать это самостоятельно. Хорошей новостью является то, что Stack является типом List, поэтому вы можете легко сделать его копию.

Stack stack = ...; //Existing stack
Stack tempStack = new Stack(); 
tempStack.addAll(stack);

Теперь tempStack и stack относятся к одному и тому же набору объектов в том же порядке, но могут быть независимо изменены.

0 голосов
/ 12 января 2012

Если объект копирования будет того же типа класса и сериализуем, вы также можете просто его сериализовать и десериализовать.Таким образом, вы получите не просто мелкую копию, а полное дерево новых объектов.Есть несколько полезных классов, которые могут помочь с этим.Apache commons имеет один, и я не уверен на 100%, но я думаю, что есть даже один в jdk5 напрямую.Я должен был бы выкопать это все же.

0 голосов
/ 12 января 2012

Прямой ответ: вы создаете новый экземпляр, а затем копируете или добавляете содержимое старого экземпляра в новый.Это то, что вспомогательные методы, конструкторы копирования и клонируемые реализации также делают под капотом, так что в конце вы сделаете то же самое.на самом деле, если вы попытаетесь реализовать его - это, пожалуй, наименее рекомендуемый подход по причинам, изложенным и упомянутым в этом обсуждении.

Вероятно, рекомендуемый способ сделать это - конструктор копирования.

0 голосов
/ 12 января 2012

Взгляните на Object.clone() http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone()

Стек расширяет Vector, который реализует возможность клонирования, поэтому вы можете просто выполнить:

Stack stackb = stacka.clone(); 
...