Создание конструктора копирования в Java - PullRequest
7 голосов
/ 22 апреля 2011

Как построить конструктор копирования, который получает другую точку (x, y) и копирует ее значения?

Я решаю подпись: public Point1 (Point1 other), но я не знаю, что в ней написать ...

Класс Point выглядит следующим образом:

public class Point1

{
    private int _x ,  _y;    
    public Point1 (Point1 other)
    {
        ...
        ...
    }
//other more constructors here...

}

Я пытался:

public Point1 (Point1 other)
{
    _x = other._x ;
    _y = other._y;
}

Но я почти уверен, что смогу сделать это лучше ..

Thnx

1 Ответ

16 голосов
/ 22 апреля 2011

Нет, ваша попытка

public Point1(Point1 other)
{
    _x = other._x ;
    _y = other._y;
}

абсолютно нормально ... (я исправил тип параметра.)

Я бы соблазнился сделать _x и _y финальными и сделать класс финальным, но это потому, что мне нравятся неизменяемые типы. Другие, безусловно, имеют разные мнения:)

Клонирование в иерархии наследования немного сложнее - каждый класс в иерархии должен иметь соответствующий конструктор, передавать любой аргумент, заданный конструктору суперкласса, а затем копировать только свои собственные поля. Например:

public class Point2 extends Point1    
{
    private int _z;
    public Point2(Point2 other)
    {
        super(other);
        this._z = other._z;
    }
}

Это не так уж плохо на стороне реализации, но если вы хотите точно клонировать Point2, вам нужно знать , что это Point2, чтобы вызвать правильный конструктор.

Реализация Cloneable позволяет сделать это немного проще, но есть и другие вещи, которые нужно учитывать: клонирование объектов не так просто, как может показаться :) (я уверен, что есть запись в Effective Java для него. Если у вас нет копии, купите ее сейчас.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...