Переопределение клона с и без Cloneable - PullRequest
6 голосов
/ 14 октября 2011

Я прочитал javadoc для Object и Cloneable и просто не «что-то получаю». Может ли кто-нибудь объяснить мне рабочие и / или функциональные различия для следующих двух примеров:

public class Widget
{
    @Override
    public Widget clone()
    {
            // ... return a clone of this Widget
    }
}

.. и:

public class Widget implements Cloneable
{
    @Override
    public Widget clone()
    {
            // ... return a clone of this Widget
    }
}

Поскольку Cloneable не имеет каких-либо связанных с ним методов, а только дает вам доступ к защищенному методу Object clone (), имеет ли смысл вообще когда-либо реализовывать его, видя, что вы Вам придется в конечном итоге написать свой собственный (безопасный) код clone ()? Заранее спасибо за любые разъяснения / вклад.

Ответы [ 2 ]

5 голосов
/ 14 октября 2011

Это договорное обязательство .

Вызов метода клонирования объекта в экземпляре, который не реализует интерфейс Cloneable, приводит к исключению CloneNotSupportedException.

Хотя не может быть методов для переопределения, вы все равно реализуете интерфейс , частью которого вы являетесь.При этом вы берете на себя все, что идет с последующим контрактом.Это заставляет вас сознательно реализовывать метод clone(), что делает поведение явным.

0 голосов
/ 14 октября 2011

a) Клонирование вызывает экстралингвистический способ конструирования объектов - без конструкторов.

b) Клонирование требует, чтобы вы как-то обрабатывали исключение CloneNotSupportedException - или беспокоили код клиента для его обработки.

c)Преимущества невелики - вам просто не нужно писать вручную конструктор копирования.Итак, используйте Cloneable идиотизмЭто не дает вам достаточных преимуществ по сравнению с усилиями, которые вам нужно подать, чтобы поступить правильно.

О Java, клонируемой

...