Реализация Clonable в Java - PullRequest
       21

Реализация Clonable в Java

2 голосов
/ 26 апреля 2010

В каких случаях я должен использовать этот способ:

public A clone() throws CloneNotSupportedException {
    A clone = (A)super.clone();
    clone.x= this.x;
    return clone;
}

И в каких случаях я должен использовать этот способ:

public ShiftedStack clone() throws CloneNotSupportedException {
    return new A(this.x);
}

Что мне делать, если x окончательно и я хочу использовать первый способ?

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 26 апреля 2010

Две вещи:

1) В первой форме нет необходимости поверхностно копировать элементы данных (clone.x = this.x).Object.clone () сделает это за вас.

2) Будьте осторожны при использовании второй формы: она всегда создает экземпляр конкретного типа A, поэтому, если вы расширяете A с помощью B, то B.clone ()больше не сможет использовать метод клона своего суперкласса.

- EDIT -

Что касается вашего вопроса, если метод clone () правильно реализован в иерархии класса X, тогда вызов super.clone () в реализации класса Xвернет экземпляр типа X .По умолчанию clone (), унаследованный от Object, является «магическим методом» в том смысле, что он создает экземпляр конкретного класса , из которого он вызывается.Он также выполняет поверхностную копию всех элементов данных.Обычно в реализации clone () выполняется глубокое копирование, чтобы избежать общих ссылок изменяемых объектов между источником и клоном.

0 голосов
/ 26 апреля 2010

первый метод не сработает. Вы не можете выгнать клон родительского класса. Это будет экземпляр родительского класса.

A clone = (A)super.clone();   // can't do this
...