Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Метод передачи объекта конструктору, Вопрос начального уровня 003 
:(
    Опции темы
PrinceOFF
  Дата 16.11.2013, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Изучаю Шилдта "Java. Полное руководство. 8-е издание". В главе 7 (стр.170) описан метод передачи объекта конструктору с пояснением:
Цитата

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

И на этом собственно все пояснение...
Код:
Код

class Box {

    double width;
    double height;
    double depth;

    // Конструктор класса Box - использует один из объектов типа Box:
    Box(Box object) {
        width = object.width;
        height = object.height;
        depth = object.depth;
    }
    
    // Конструктор класса Box - при указании всех значений объекта типа Box:
    Box(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }
...


И кусок кода главного класса:

Код

public class OverloadCons2 {
    
    public static void main(String[] args) {

        // Объявление, резервирование и инициализация объектов Box с применением  различных конструкторов:
        Box mybox1 = new Box(10, 20, 30);
        Box mybox2 = new Box();
        Box mybox3 = new Box(20);
        Box myclone = new Box(mybox1); // Создание копии объекта mybox1

        double vol;
...


В данном примере рассматриваемый метод позволяет выводить значения клона mybox1 - это как бы мне понятно, хотя тело конструктора и вызывает некоторое невосприятие моим, пока еще, мышлением не программиста.
Собственно, я никак не могу понять для чего реально используется этот метод в реальных задачах при программировании? Может быть кто-то использует данный метод в своей работе (и как часто он действительно применяется на практике?) и сможет мне привести пример и объяснить на пальцах?
PM   Вверх
jManiak
Дата 16.11.2013, 19:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Правильно делаете, что сомневаетесь в таком подходе. Честно говоря не могу придумать задачи, где именно так нужно было бы ее решать. 

А вообще, "все уже написано за нас": есть такая замечательная штука как Интерфейс Cloneable
PM MAIL ICQ   Вверх
jelum
Дата 16.11.2013, 19:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











К примеру, тебе надо нарисовать одинаковые кнопки, которые отличаются только расположением. ты можешь создать эталонную кнопку, а потом копированием сделать остальные. В остальных же тебе надо будет только изменить координаты расположения. Копировать ты можешь передавая конструктору кнопки эталон.

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
PrinceOFF
Дата 19.11.2013, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Подождал... Но два, полярных ответа так и остались...
Вобщем, приму наличие метода как данность, спасибо.
PM   Вверх
Magistrus
Дата 19.11.2013, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Жив
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 14.6.2006
Где: г. Одесса

Репутация: нет
Всего: 1



Такое решение эффективно только в случае, если поля клонируемого объекта представляют собой значения базовых типов и их оболочек или неизменяемых (immutable) объектных типов. Если же поле клонируемого типа является изменяемым объектным типом, то для корректного клонирования требуется другой подход. 

Пример:
Код


class Box {
    Dimension size;
    double depth;
    // Конструктор класса Box - использует один из объектов типа Box:
    Box(Box object) {
        // можно конечно написать вот так 
        Dimension size = object.getSize()
        this.size = new   Dimension(size.getWidth(), size.getHeght());
        // но у класса Dimension  уже может быть реализованый метод clone() который реализовывает  глубокое копирование, а мы его проигнорировали и написали свое.  
        depth = object.depth;
    }
    
...


Вывод: 
Если имеещь класс с простыми типами и необходимо создать много одинаковых объектв по шаблону, можно использовать конструктор копирования. Если же у тебя объект с сылочными типами которые имеют сложную иерархическую структуру и  свои реализованные методы копирования, то лучше реализовать в своем классе метод clone. 

Это сообщение отредактировал(а) Magistrus - 20.11.2013, 10:30
--------------------
~ вот такая вот загагулина ~ 
PM MAIL WWW ICQ Skype   Вверх
PrinceOFF
Дата 19.11.2013, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Ну вот, реальный пример!  smile 
Только есть несколько вещей мне не понятныйх...
1. Что такое "Dimension size"? Ниже по коду в комментариях написано, что это класс. Тогда почему он так странно обозначен?
Код

class Box {
    Dimension size;
    double depth;

2. Слышал уже давно про геттеры и сеттеры, но почему-то у Шилдта про это ни слова ни сказано...((( Либо, может это будет где-то позже, хотя начал искать в оглавлении - ничего не нашел... Это как раз и есть, т.н. геттер?:
Код

Dimension size = object.getSize()
        this.size = new   Dimension(size.getWidth(), size.getHeght());

На первый взглад, смутно понимаю, что мы объекту size (хотя, это по сути переменные нашего объекта Box) класса Demension задаем значения ширины и высоты, но поскольку это какая-то незнакомая мне конструкция, все крайне размыто... 
Я так понимаю, что этими геттерами удобно пользоваться, если так много людей их применяет. Может быть кто-то подскажет теоретически в какой главе Шилдта может быть растолковано про эти методы? Другой литературой пользоваться не хотелось бы... Особенно, Хорстманом...(((
С другой стороны, логично предположить, что если Шилдт, не посчитал нужным включить информацию по этим методам (на данном этапе), то значит они сейчас мне как бы и не надо...
3. Почему в таком случае, не включить в этот метод и параметр глубины? Либо эти геттеры не позволяют это сделать?

P.S. Если эти вопросы кажутся детскими - то так оно и есть  smile  С учетом того, что я пока на отрезке изучения "Классы - Наследование" многое не ясно... Спасибо
PM   Вверх
Samotnik
Дата 19.11.2013, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



PrinceOFF, отвечу на первый пост. 
Это - конструктор копирования. На мой взгляд он лучше метода clone:
0. Можно передавать параметры
1. Не нужно обрабатывать странное исключение CloneUnsupportedException 
2. Не нужно менять спецификатор доступа
3. внутри можно использовать при необходимости условия.
4. Просто намного проще и понятнее.

Для чего реально использовать? Например, есть у тебя сайт с объявлениями. Владелец может менять свое объявление сколько угодно раз и оно не должно показывать пользователям до прохождения модерации, но старая версия должна быть доступна всегда. Вот тут я и использовал конструктор копирования. Брал объявление, копировал его (делал клон в БД). Старое показывал всем, а редактируемое только владельцу и модератору.
PM MAIL   Вверх
Pawl
Дата 20.11.2013, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(PrinceOFF @  19.11.2013,  21:15 Найти цитируемый пост)
1. Что такое "Dimension size"? Ниже по коду в комментариях написано, что это класс.

Да, это класс, в переводе "размерность", т. е. длина и ширина. Его ввели для демонстрации клонирования объектов. Поскольку ваш вопрос касался только конструктора копирования, на который ответ тут уже дан, можете пока не заморачиваться на клонировании объектов. Кстати, у Шилда есть про клонирование объектов, когда рассматривается библиотека java.lang.
Цитата(PrinceOFF @  19.11.2013,  21:15 Найти цитируемый пост)
Слышал уже давно про геттеры и сеттеры, но почему-то у Шилдта про это ни слова ни сказано...

геттеры и сеттеры - методы для получения и изменения private-переменной:
Код

...
private int x;

public void setX(int x) {
    this.x = x;
}

public int getX() {
    return x;
}

подробнее разберетесь с этим, когда будете читать про методы.
 smile 
Цитата(PrinceOFF @  19.11.2013,  21:15 Найти цитируемый пост)
С другой стороны, логично предположить, что если Шилдт, не посчитал нужным включить информацию по этим методам (на данном этапе), то значит они сейчас мне как бы и не надо...

Напомнило анекдот: Выносит новый батюшка прихожанам книгу - что, братие, читал ли вам сию книгу прежний батюшка?
- читал, отче, хорошо ее знаем!
- ну, раз знаете, то и читать вам ее не нужно...
На другой день выносит другую книгу - а сию книгу читал ли вам прежний батюшка?
- нет, отче, не читал!
- ну, раз не читал, то и знать вам ее не нужно!
Я это к тому, что Шилд - не догма. Безусловно, хорошо пишет, он тоже был моей первой книгой по java, но и в других книгах тоже есть зёрна истины! smile 

Это сообщение отредактировал(а) Pawl - 20.11.2013, 09:46


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
PrinceOFF
Дата 20.11.2013, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Samotnik, спасибо, пример понял.
Pawl, анекдот хороший - смеялся  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.