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


Автор: devmstr 21.2.2007, 08:15
Что будет содердать ms1?

Mouse ms0= new Mouse(...);
ms1 = ms0;


Что он будет содержать ссылку на ms0 или его копию?

Автор: tux 21.2.2007, 08:19
Цитата(devmstr @  21.2.2007,  08:15 Найти цитируемый пост)
Что он будет содержать ссылку на ms0 или его копию? 

ms1 будет содержать ссылку на объект, созданный с помощью 'new Mouse()'. ms0 будет содержать точно такую же ссылку.

Автор: devmstr 21.2.2007, 08:26
Понятно, а как мне тогда создать копию объекта?

Автор: djGri 21.2.2007, 12:16
ms1 = ms0.clone();
(У Mouse должен быть переопределен clone(), который он наследовал у object'a )

Автор: _Y_ 21.2.2007, 13:39
Поскольку разные объекты клонируются по разному, единой схемы разработано быть не может. 

Ну, например, у объекта имеется ссылка на главное окно программы. Естественно, что у клона должна быть такая же ссылка (главное окно-то одно). Другой объект содержит редактируемое JTextField, из которого он берет данные. Естественно, что при клонировании должно быть создано новое поле, содержащее тот же текст (иначе один и тот же текст будет сообщаться всем клонированным объектам).

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

Всегда жаль расстраивать хороших людей smile 

Автор: LSD 21.2.2007, 14:35
Цитата(_Y_ @  21.2.2007,  13:39 Найти цитируемый пост)
Ну, например, у объекта имеется ссылка на главное окно программы. Естественно, что у клона должна быть такая же ссылка (главное окно-то одно). Другой объект содержит редактируемое JTextField, из которого он берет данные. Естественно, что при клонировании должно быть создано новое поле, содержащее тот же текст (иначе один и тот же текст будет сообщаться всем клонированным объектам).

Неудачный пример. Объекты GUI должны клонироваться, в исключительных случаях.

Вообще стандартный clone() осуществляет лишь поверхностное клонирование, т.е. копируются только ссылки на объекты. Но в принципе никто не мешает доработать его напильником.

Автор: nornad 21.2.2007, 14:55
Цитата(LSD @  21.2.2007,  14:35 Найти цитируемый пост)
Но в принципе никто не мешает доработать его напильником. 

Особенно если учесть, насколько редко требуется создавать полную копию объекта со всем его содержимым. Много чаще хватает просто второй ссылки.

Автор: _Y_ 21.2.2007, 17:31
Цитата(LSD @ 21.2.2007,  14:35)
Неудачный пример. Объекты GUI должны клонироваться, в исключительных случаях.

Я, собственно, хотел доходчиво объяснить идею. А удачный пример, да на вскидку - это не ко мне, это к гуру smile 

ЗЫ. Такой пример привел именно потому, что у меня была подобная задача с GI когда-то давно и именно на ней я в вопросах клонирования разобрался. Правда это была не Java, а VB6 (тА еще гадость в плане объектном модели).

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

Автор: LSD 21.2.2007, 17:38
Цитата(_Y_ @  21.2.2007,  17:31 Найти цитируемый пост)
Кстати, а почему в исключительных? Сделал объект, расклонировал, добавил все клоны в контейнер и радуйся жизни

А если он уже был добавлен? У двух разных компонентов будет общий контейнер, при этом сам контейнер "знает" только об одном. Плюс всевозможные листенеры, тоже не понятно, что с ними делать.
Да и GUI компоненты довольно плохо клонируются, т.к. там куча классов, которые не клонируемы и реализация которых скрыта, вот попробуй тот же Graphics клонировать.

Автор: _Y_ 21.2.2007, 18:12
Цитата(LSD @ 21.2.2007,  17:38)
Да и GUI компоненты довольно плохо клонируются...

По моему мы говорим о разных вещах. Я вроде не прелагал клонировать UI компоненты. Я писал
Цитата
...при клонировании должно быть создано новое поле...

Т.е. клонируется какой-то объект данных, хранящий ссылку на новое JTextField. А уж как оно
создается - объект его знает. Самое простое - в конструкторе объекта прописать
Код

ObjectsTextField = new JTextField();

но вариантов может быть много.

Так что ни о каком клонировании UI я, вроде не говорил.

Автор: devmstr 22.2.2007, 07:13
Спасибо! Буду знать!

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