| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Метод передачи объекта конструктору |
| Автор: PrinceOFF 16.11.2013, 14:53 | ||||||
Изучаю Шилдта "Java. Полное руководство. 8-е издание". В главе 7 (стр.170) описан метод передачи объекта конструктору с пояснением:
И на этом собственно все пояснение... Код:
И кусок кода главного класса:
В данном примере рассматриваемый метод позволяет выводить значения клона mybox1 - это как бы мне понятно, хотя тело конструктора и вызывает некоторое невосприятие моим, пока еще, мышлением не программиста. Собственно, я никак не могу понять для чего реально используется этот метод в реальных задачах при программировании? Может быть кто-то использует данный метод в своей работе (и как часто он действительно применяется на практике?) и сможет мне привести пример и объяснить на пальцах? |
| Автор: jManiak 16.11.2013, 19:03 |
| Правильно делаете, что сомневаетесь в таком подходе. Честно говоря не могу придумать задачи, где именно так нужно было бы ее решать. А вообще, "все уже написано за нас": есть такая замечательная штука как http://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html |
| Автор: jelum 16.11.2013, 19:35 |
| К примеру, тебе надо нарисовать одинаковые кнопки, которые отличаются только расположением. ты можешь создать эталонную кнопку, а потом копированием сделать остальные. В остальных же тебе надо будет только изменить координаты расположения. Копировать ты можешь передавая конструктору кнопки эталон. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Метод-передачи-объекта-конструктору-id52875d4eae20155309000000#findElement_E7045_52879ec8ae2015805d000931_0 |
| Автор: PrinceOFF 19.11.2013, 09:54 |
| Подождал... Но два, полярных ответа так и остались... Вобщем, приму наличие метода как данность, спасибо. |
| Автор: Magistrus 19.11.2013, 11:12 | ||
| Такое решение эффективно только в случае, если поля клонируемого объекта представляют собой значения базовых типов и их оболочек или неизменяемых (immutable) объектных типов. Если же поле клонируемого типа является изменяемым объектным типом, то для корректного клонирования требуется другой подход. Пример:
Вывод: Если имеещь класс с простыми типами и необходимо создать много одинаковых объектв по шаблону, можно использовать конструктор копирования. Если же у тебя объект с сылочными типами которые имеют сложную иерархическую структуру и свои реализованные методы копирования, то лучше реализовать в своем классе метод clone. |
| Автор: PrinceOFF 19.11.2013, 21:15 | ||||
| Ну вот, реальный пример! Только есть несколько вещей мне не понятныйх... 1. Что такое "Dimension size"? Ниже по коду в комментариях написано, что это класс. Тогда почему он так странно обозначен?
2. Слышал уже давно про геттеры и сеттеры, но почему-то у Шилдта про это ни слова ни сказано...((( Либо, может это будет где-то позже, хотя начал искать в оглавлении - ничего не нашел... Это как раз и есть, т.н. геттер?:
На первый взглад, смутно понимаю, что мы объекту size (хотя, это по сути переменные нашего объекта Box) класса Demension задаем значения ширины и высоты, но поскольку это какая-то незнакомая мне конструкция, все крайне размыто... Я так понимаю, что этими геттерами удобно пользоваться, если так много людей их применяет. Может быть кто-то подскажет теоретически в какой главе Шилдта может быть растолковано про эти методы? Другой литературой пользоваться не хотелось бы... Особенно, Хорстманом...((( С другой стороны, логично предположить, что если Шилдт, не посчитал нужным включить информацию по этим методам (на данном этапе), то значит они сейчас мне как бы и не надо... 3. Почему в таком случае, не включить в этот метод и параметр глубины? Либо эти геттеры не позволяют это сделать? P.S. Если эти вопросы кажутся детскими - то так оно и есть |
| Автор: Samotnik 19.11.2013, 22:33 |
| PrinceOFF, отвечу на первый пост. Это - конструктор копирования. На мой взгляд он лучше метода clone: 0. Можно передавать параметры 1. Не нужно обрабатывать странное исключение CloneUnsupportedException 2. Не нужно менять спецификатор доступа 3. внутри можно использовать при необходимости условия. 4. Просто намного проще и понятнее. Для чего реально использовать? Например, есть у тебя сайт с объявлениями. Владелец может менять свое объявление сколько угодно раз и оно не должно показывать пользователям до прохождения модерации, но старая версия должна быть доступна всегда. Вот тут я и использовал конструктор копирования. Брал объявление, копировал его (делал клон в БД). Старое показывал всем, а редактируемое только владельцу и модератору. |
| Автор: PrinceOFF 20.11.2013, 11:44 |
| Samotnik, спасибо, пример понял. Pawl, анекдот хороший - смеялся |