Java: Обоснование интерфейса Cloneable

Почему метод .clone() не указан в интерфейсе java.lang.Cloneable?

Ответ 1

В принципе, это сломанный интерфейс. Кен Арнольд и Билл Веннерс обсудили это в Проблемы разработки Java.

Арнольд:

Если бы я был Богом в этот момент, и многие люди, вероятно, рады, что я не, я бы сказал, обесценил Cloneable и имел Copyable, потому что Cloneable имеет проблемы. Помимо того, что он опечатан, Cloneable не содержит метода clone. Это означает, что вы не можете проверить, является ли что-то экземпляром Cloneable, отбросить его до Cloneable и вызвать clone. Вы снова должны использовать отражение, что ужасно. Это только одна проблема, но я определенно решаю.

Ответ 2

Посмотрите эту ошибку в базе данных ошибок Java:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033

По сути, это дефект дизайна в более ранних версиях Java, который они не намерены исправлять в интерфейсе Cloneable, так как это нарушит совместимость с некоторым существующим кодом.

Ответ 3

В Java существует эта концепция интерфейсов маркеров. Интерфейс Cloneable не имеет методов или полей и служит только для идентификации семантики клонирования.

из dev-x веб-сайт:

Часто вы сталкиваетесь с интерфейсами в Java, которые не имеют поведения. Другими словами, они являются просто пустыми определениями интерфейсов. Они известны как интерфейсы маркеров. Некоторые примеры интерфейсов маркеров в API Java включают в себя:

Ответ 4

В проекте, над которым я работаю, мы создали интерфейс PublicCloneable, он содержит метод clone и указывает, что он является общедоступным.

Я нахожу это полезным: тот факт, что существует метод клонирования, но вы не можете получить к нему доступ, не очень помогает.

public interface PublicCloneable extends Cloneable {
    public Object clone();
}

Ответ 5

Поскольку метод clone реализуется в классе Object из-за его "специального" условия: копия памяти объектов любого типа.