Почему не был указан метод .clone()
, указанный в интерфейсе java.lang.Cloneable
?Java: Обоснование интерфейса Cloneable
ответ
В основном, это сломанный интерфейс. Кен Арнольд и Билл Веннерс обсудили его в Java Design Issues.
Арнольд:
Если бы я был Бог в этот момент, и многие люди, вероятно, рад, что я не являюсь, я бы сказал, принизить
Cloneable
и имеютCopyable
, потому чтоCloneable
есть проблемы. Помимо того, что он ошибочно написан,Cloneable
не содержит методаclone
. Это означает, что вы не можете проверить, является ли что-то экземпляромCloneable
, отбросить его доCloneable
и вызватьclone
. Вы снова должны использовать отражение, что ужасно. Это только одна проблема, но я определенно решаю.
Смотрите эту ошибку в базе данных багов Java:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
По сути, это конструктивный недостаток в более ранних версиях Java, что они не намерены закрепить в Cloneable интерфейс, чтобы сделать это будет совместимость с некоторыми существующими кодами.
Интересно, почему они не добавлял 'интерфейс Copyable' в Java 1.2 и далее ... – EpicPandaForce
@EpicPandaForce Возможно потому, что мы не хотим, чтобы имитировать C++ в определенных ситуациях. Клонирование следует использовать с осторожностью, большую часть времени оно не достигает того, чего вы хотите достичь. Недостатком в Java является наличие параметров 'const', но копирование каждого экземпляра объекта (изменчивого) не является хорошим решением. И да, есть некоторые вещи, в которых Java отстой, и это один из них.Используйте классы Kotlin/data. –
Поскольку метод clone реализован в классе Object из-за его «специального» условия: копия памяти объектов любого типа.
В Java существует эта концепция интерфейсов маркеров. Интерфейс Cloneable
не имеет методов или полей и служит только для идентификации семантики клонирования.
из dev-x сайте:
Часто вы столкнетесь интерфейсы в Java, которые не имеют никакого поведения. Другими словами, они являются просто пустыми определениями интерфейсов. Они известны как интерфейсы маркеров. Некоторые примеры маркерных интерфейсов в Java API, включают в себя:
Я не думаю, что это странная концепция. Иногда полезно видеть, может ли что-то действовать как альтернативный тип. Как говорили другие, Cloneable сломан. –
Они должны действовать как миксины. Не мой любимый механизм на строго типизированном языке, например java, но он имеет смысл для Serializable, sorta. – wds
@ Сериализуемый имел бы больше смысла. Или, по крайней мере, это было бы сделано, если бы аннотации появились десятилетие назад. –
На проекте я работаю, мы создали интерфейс под названием PublicCloneable, содержит метод клонирования и указывает, что он является публичным.
Я нахожу это полезным: тот факт, что есть метод клонирования, но вы не можете получить к нему доступ, не очень помогает.
public interface PublicCloneable extends Cloneable {
public Object clone();
}
Каким будет использование этого интерфейса (PublicConeable)? – Otto
@Otto: например, CloneHelper с методом public static PublicCloneable copy (PublicCloneable obj), который проверяет наличие null или просто копирует (Object obj) и проверяет как null, так и instanceof PublicCloneable –
Когда вы возвращаете объект из локального кеш например ... Тем не менее, сериализация/десериализация, вероятно, безопаснее. –
- 1. Как массивы Java реализуют Cloneable?
- 2. О Java cloneable
- 3. О интерфейсе Java Cloneable
- 4. Java Cloneable без реализации
- 5. Реализация Java Cloneable Interface
- 6. Cloneable поведение
- 7. Обоснование кода в Java
- 8. Обоснование иерархии исключений Java
- 9. Право Обоснование в Java
- 10. Интерфейс, который возвращает его self (Cloneable)
- 11. Вопрос о Cloneable интерфейса и исключения, которые должны быть брошенной
- 12. Путаница Cloneable интерфейс и Object.clone() в Java
- 13. Текст библиотека обоснование в Java
- 14. Почему Intent реализует Cloneable?
- 15. Cloneable and WebDriver (Selenium)
- 16. C++ Cloneable Mixin
- 17. Как реализовать класс Cloneable?
- 18. Как Объект [] cloneable
- 19. Cloneable and Collection
- 20. Каково обоснование пространства имен пользовательского интерфейса в Qt?
- 21. java: обоснование существования разных классов исключений
- 22. Почему коллекция не расширяется Cloneable и Serializable?
- 23. java Cloneable: базовый класс реализует его неправильно; что делать?
- 24. Почему по умолчанию clone() в Cloneable в Java 8
- 25. Обоснование текста
- 26. Нужен ли родительский класс для реализации Cloneable-интерфейса, если мы хотим клонировать подкласс?
- 27. Обоснование MessageSource в Django?
- 28. Внедрение сопоставимого интерфейса Java?
- 29. Java: установить различия интерфейса интерфейса и интерфейса
- 30. TEXTVIEW обоснование местоположение
Дизайн глупо. Мне интересно, почему Sun никогда не исправляла это. – tactoth
Почему он не был исправлен в Java 8? Не были ли удалены/изменены ранее неработающие/неэффективные части Java? –
Это «сломан», потому что несколько человек так говорят? «Cloneable не содержит метод clone» Да, и его документация никогда не говорила, что это будет. «Это означает, что вы не можете проверить, является ли что-то экземпляром Cloneable, отбрасывать его на Cloneable и вызывать клон». Опять же, это вовсе не цель «Cloneable». 'Cloneable' состоит в том, чтобы сделать' Object.clone() 'throw исключение или нет. Он никогда не был интерфейсом для вызова 'clone'. Может быть, было бы хорошо, если бы у Java был такой интерфейс, но отсутствие одного не привело к нарушению другого интерфейса ('Cloneable'). – newacct