Java: обоснование интерфейса Cloneable - PullRequest
32 голосов
/ 02 апреля 2009

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

Ответы [ 5 ]

36 голосов
/ 02 апреля 2009

По сути, это сломанный интерфейс. Кен Арнольд и Билл Веннерс обсуждали это в Java Design Issues .

Arnold:

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

10 голосов
/ 02 апреля 2009

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

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

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

6 голосов
/ 02 апреля 2009

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

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

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

5 голосов
/ 02 апреля 2009

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

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

public interface PublicCloneable extends Cloneable {
    public Object clone();
}
1 голос
/ 02 апреля 2009

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

...