Какой смысл позволять моему классу реализовывать Cloneable? - программирование
Подтвердить что ты не робот

Какой смысл позволять моему классу реализовывать Cloneable?

Я наткнулся на некоторый код класса, который реализует Clonable, в документации говорится:

Класс реализует интерфейс Cloneable, чтобы указать методу Object.clone(), что для этого метода допустимо делать копию поля для поля экземпляров этого класса. Вызов метода клонирования объекта в экземпляре, который не реализует интерфейс Cloneable, приводит к исключению CloneNotSupportedException. По соглашению классы, которые реализуют этот интерфейс, должны переопределить Object.clone (который защищен) с помощью открытого метода. Смотрите Object.clone() для подробностей о переопределении этого метода. Обратите внимание, что этот интерфейс не содержит метод клонирования. Следовательно, невозможно клонировать объект только в силу того факта, что он реализует этот интерфейс. Даже если метод клона вызывается рефлексивно, нет никаких гарантий, что он будет успешным.

Я не могу понять смысл в реализации этого класса, как сказано в документации, метод .clone не реализован в интерфейсе, и я должен реализовать его. Так зачем использовать этот класс? Почему я не могу просто написать метод copyClass в своем классе, чтобы сделать копию объекта без реализации этого класса?

4b9b3361

Ответ 1

Чтобы реализовать метод clone, вы просто выполните:

public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

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

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

Короче говоря, вы создаете защищенный метод клонирования объекта public. И первое, что делает метод Object.clone() (это не настоящий код, но это то, что делает метод):

if (!(this instanceof Cloneable)) {
    throw new CloneNotSupportedException();
}

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

Это одна из самых плохо разработанных частей Java. Обычно вместо использования clone() вам следует использовать конструктор копирования.

Ответ 2

Это позволяет вам писать более общий код. Если у вас есть несколько классов, реализующих интерфейс Cloneable, и вы хотите передать их экземпляры в качестве аргумента методу, вам не нужно создавать несколько методов, отличающихся одним типом переменной, вы можете просто использовать Cloneable t. То же самое с другими интерфейсами. И то же самое с каждым другим интерфейсом, это своего рода множественное наследование. Внедрение этих интерфейсов делает ваш код более понятным.

Ответ 3

В дополнение к тому, что говорили другие, Cloneable часто используется при реализации шаблона проектирования прототипа.