Почему метод .clone()
не указан в интерфейсе java.lang.Cloneable
?
Java: Обоснование интерфейса 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 из-за его "специального" условия: копия памяти объектов любого типа.