Как реализация интерфейса Cloneable позволяет клонировать объекты, поскольку это интерфейс маркера и не имеет никаких методов?

У меня есть класс, объект которого я хочу клонировать. Я сделал это, реализовав интерфейс Cloneable и переопределив метод клонирования. Но если я создаю метод клонирования без реализации интерфейса Cloneable, он генерирует исключение. Какую суперсилу этот интерфейс маркеров (Cloneable) дает моему классу?


person Nayan Arora    schedule 16.10.2018    source источник
comment
Точно так же Serializable записывает объекты на диск, несмотря на то, что это интерфейс маркера.   -  person Elliott Frisch    schedule 16.10.2018
comment
Этот ответ на дубликат объясняет, как работает реализация Cloneable. Интерфейс просто говорит нативному методу Object.clone: «Эй, ты можешь меня клонировать». Без интерфейса метод откажется клонировать объект (сгенерировав исключение). Как упоминал Эллиот, это похоже на то, как используется Serializable.   -  person Slaw    schedule 16.10.2018


Ответы (2)


Клонирование объектов в java:

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

person Khalid Shah    schedule 16.10.2018

Он позволяет клонировать в соответствии с JavaDoc из Object.clone:

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

Каждый раз, когда вы вызываете Object.clone(), это требование проверяется.

JavaDoc из Cloneable сам говорит:

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

Подводя итог:
это часть указанного поведения. Несоблюдение этого требования будет очевидно во время выполнения.

person LuCio    schedule 16.10.2018