У меня есть класс, объект которого я хочу клонировать. Я сделал это, реализовав интерфейс Cloneable и переопределив метод клонирования. Но если я создаю метод клонирования без реализации интерфейса Cloneable, он генерирует исключение. Какую суперсилу этот интерфейс маркеров (Cloneable) дает моему классу?
Как реализация интерфейса Cloneable позволяет клонировать объекты, поскольку это интерфейс маркера и не имеет никаких методов?
Ответы (2)
Клонирование объектов в java:
Есть интерфейс Cloneable
. Вы ожидаете, что интерфейс будет иметь метод clone(), который вернет копию объекта. Но это не так. Cloneable
- это просто интерфейс маркера. Это означает, что у него нет никаких методов, он просто помечает класс как подходящий для клонирования. Вместо этого метод clone
присутствует в классе Object
.
Он позволяет клонировать в соответствии с JavaDoc из Object.clone
:
Во-первых, если класс этого объекта не реализует интерфейс
Cloneable
, то выдаетсяCloneNotSupportedException
.
Каждый раз, когда вы вызываете Object.clone()
, это требование проверяется.
JavaDoc из Cloneable
сам говорит:
Класс реализует интерфейс
Cloneable
, чтобы указать методуObject.clone()
, что этому методу разрешено создавать полевые копии экземпляров этого класса. Вызов метода clone объекта Object для экземпляра, который не реализует интерфейсCloneable
, приводит к возникновению исключенияCloneNotSupportedException
.
Подводя итог:
это часть указанного поведения. Несоблюдение этого требования будет очевидно во время выполнения.
Serializable
записывает объекты на диск, несмотря на то, что это интерфейс маркера. - person Elliott Frisch   schedule 16.10.2018Cloneable
. Интерфейс просто говорит нативному методуObject.clone
: «Эй, ты можешь меня клонировать». Без интерфейса метод откажется клонировать объект (сгенерировав исключение). Как упоминал Эллиот, это похоже на то, как используетсяSerializable
. - person Slaw   schedule 16.10.2018