Чому метод clone відсутній в інтерфейсі для клонування?
Тому що охороняється. Якщо інтерфейс Cloneable визначив clone() як публічний метод, будь-який об’єкт, що реалізує Cloneable, експортував би реалізацію, визначену класом Object, як публічний метод. Однак загальнодоступну версію не можна назвати об’єктом, тому код мав би транслюватися з об’єкта на Cloneable.
Метод clone() за умовчанням має реалізацію дрібної копії (створення копії об’єкта, копіювання посилань). Оскільки інтерфейси не містять реалізації (це змінено, починаючи з Java 8), його поміщають у клас об’єктів (кореневий) і роблять Cloneable як інтерфейс маркера (без будь-яких методів).
Метод clone() не має реалізації в Object і нічого не робить. Щоб це запрацювало, ваш клас має реалізувати Cloneable. Це інтерфейс маркера, який додає деякі методи до будь-якого класу, що його успадковує, щоб ви могли клонувати об’єкт цього класу.
Сигнатура методу: protected Object clone() викидає CloneNotSupportedException; Щоб clone() працював, клас повинен реалізувати інтерфейс Cloneable. Це маркерний інтерфейс, тобто він не містить жодних методів, але вказує, що клас придатний для клонування.
Генрі Вонг написав: інтерфейс Cloneable — який має один метод, метод clone(). Ні, не так. Метод clone() оголошено в Object як захищений.
Виклик методу клонування об’єкта в екземплярі, який не реалізує інтерфейс Cloneable, призводить до виникнення винятку CloneNotSupportedException. За домовленістю, класи, які реалізують цей інтерфейс, мають замінити Object. клон (який захищений) за допомогою відкритого методу.