2009-04-02 3 views

ответ

36

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

Арнольд:

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

+0

Дизайн глупо. Мне интересно, почему Sun никогда не исправляла это. – tactoth

+0

Почему он не был исправлен в Java 8? Не были ли удалены/изменены ранее неработающие/неэффективные части Java? –

+3

Это «сломан», потому что несколько человек так говорят? «Cloneable не содержит метод clone» Да, и его документация никогда не говорила, что это будет. «Это означает, что вы не можете проверить, является ли что-то экземпляром Cloneable, отбрасывать его на Cloneable и вызывать клон». Опять же, это вовсе не цель «Cloneable». 'Cloneable' состоит в том, чтобы сделать' Object.clone() 'throw исключение или нет. Он никогда не был интерфейсом для вызова 'clone'. Может быть, было бы хорошо, если бы у Java был такой интерфейс, но отсутствие одного не привело к нарушению другого интерфейса ('Cloneable'). – newacct

10

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

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

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

+0

Интересно, почему они не добавлял 'интерфейс Copyable' в Java 1.2 и далее ... – EpicPandaForce

+0

@EpicPandaForce Возможно потому, что мы не хотим, чтобы имитировать C++ в определенных ситуациях. Клонирование следует использовать с осторожностью, большую часть времени оно не достигает того, чего вы хотите достичь. Недостатком в Java является наличие параметров 'const', но копирование каждого экземпляра объекта (изменчивого) не является хорошим решением. И да, есть некоторые вещи, в которых Java отстой, и это один из них.Используйте классы Kotlin/data. –

1

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

6

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

из dev-x сайте:

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

+1

Я не думаю, что это странная концепция. Иногда полезно видеть, может ли что-то действовать как альтернативный тип. Как говорили другие, Cloneable сломан. –

+0

Они должны действовать как миксины. Не мой любимый механизм на строго типизированном языке, например java, но он имеет смысл для Serializable, sorta. – wds

+5

@ Сериализуемый имел бы больше смысла. Или, по крайней мере, это было бы сделано, если бы аннотации появились десятилетие назад. –

5

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

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

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

Каким будет использование этого интерфейса (PublicConeable)? – Otto

+0

@Otto: например, CloneHelper с методом public static PublicCloneable copy (PublicCloneable obj), который проверяет наличие null или просто копирует (Object obj) и проверяет как null, так и instanceof PublicCloneable –

+0

Когда вы возвращаете объект из локального кеш например ... Тем не менее, сериализация/десериализация, вероятно, безопаснее. –

Смежные вопросы