Я читал везде, что если я вызову clone() без реализации Cloneable interface, я получу CloneNotSupportedException. Если я реализую метод clone в классе, который не реализует Cloneable, я все равно могу вызвать исключение clone() без исключения. Я имею в виду, что реализация Cloneable не имеет значения. Пожалуйста, уточните ........Необходимо ли использовать Clonable?
ответ
Реализация интерфейса Cloneable просто сообщает программисту, что этот объект должен иметь допустимый метод клонирования.
Если вы смотрели на Cloneable интерфейса вы найдете комментарий, который выглядит, как этот
Обратите внимание, что этот интерфейс делает не содержать клон метода. Таким образом, невозможно клонировать объект только по в силу того, что он реализует этот интерфейс. Даже если метод клонирования рефлексивно вызван, нет никакой гарантии, что он добьется успеха .
Клонируемый интерфейс - это всего лишь практика программирования, которую программист должен соблюдать, если они добавляют реализацию для клонирования.
Ваш класс унаследовал защищенный метод clone() (и он может создать мелкую копию вашего объекта) из Object. Однако, чтобы получить доступ к этому методу вне определения вашего класса, вам необходимо пометить свой класс как Cloneable, а значит, и реализацию.
В примере, который вы указали, если вы создали метод с той же сигнатурой, что и clone(), реализация Cloneable просто не имеет значения для компилятора, поскольку он получит доступ к запрошенному методу, поэтому реализация Cloneable будет просто эмпирической. Тем не менее, я предлагаю вам придерживаться подхода с хорошей практикой.
", чтобы получить доступ к этому методу вне определения вашего класса, вы должны пометить свой класс как «Cloneable». Доступ к вашему методу зависит только от спецификаторов доступа, которые вы применяете к вашему методу. Реализация «Cloneable» абсолютно не имеет к этому отношения. – newacct
Что вы говорите абсолютно правильно, если вы определили clone() в своем классе. Однако, если вы не реализуете Cloneable и не переопределяете этот метод, вы не можете получить доступ к нему за пределами, потому что он неявно защищен. Возьмем, например: public class A {}. Вы можете вызвать клон изнутри, но не тогда, когда у вас есть экземпляр (например, A a = new A(); a.clone() -> это не сработает, но открытый класс A {public void test() {this .clone()}} будет). Возможно, я не смог объяснить, что я на самом деле имел в виду. Пожалуйста, извините мой ржавый английский. Кроме того, если я не понял, что вы имели в виду, я открыт для дальнейших объяснений. –
Вы можете реализовать открытый метод 'clone()', а не реализовывать 'Cloneable'. Метод будет доступен, потому что вы его внедрили. И наоборот, вы не можете реализовать общедоступный метод 'clone()' и реализовать 'Cloneable'. Этот метод не будет доступен за пределами вашего класса, потому что вы его не реализовали. Реализация «Cloneable» не имеет значения. – newacct
Я читал везде, что если я вызову clone() без реализации Cloneable interface, я получу CloneNotSupportedException.
Правильно, если речь идет об Object.clone().
Если я реализую метод clone в классе, который не реализует Cloneable, я все равно могу вызвать исключение clone() без исключения.
Нет, вы не можете, если мы говорим об Object.clone().
Я имею в виду, что реализация Cloneable не имеет значения.
Да, так оно и есть. Возможно, ваш класс наследуется от класса, который уже реализует Cloneable. Не видя никакого кода, невозможно понять, как вы пришли к этому заблуждению.
Просьба уточнить.
Не о чем говорить. Вы ошибаетесь. Вот и все.
Это пример класса, не реализующего Cloneable, который вызывает его, не вызывая исключения. 'public class Cloneer { public Cloneer clone() { return new Cloneer(); } public static void main (String [] args) { (new Cloneer()). Clone(); } } ' – FDinoff
Это пример класса, который не вызывает Object.clone(), поэтому ни один из побочных эффектов, указанных для Object.clone(), не применяется к нему, включая NotCloneableException. Я предлагаю вам прочитать Джавадока. Не настоящий вопрос. – EJP
Может быть, вам следует объяснить, что вы думаете о путанице? – FDinoff
- 1. Действительно ли необходимо использовать объект «monitor» (java)
- 2. Подсчет количества списков, необходимо ли использовать free()?
- 3. Является ли Java необходимо использовать Red5
- 4. Необходимо ли использовать DbCommand после использования?
- 5. hasoop необходимо использовать Giraph
- 6. ASP, необходимо использовать SFTP
- 7. необходимо использовать dispatch_queue здесь
- 8. необходимо использовать hasoop native
- 9. использовать командование команды sed необходимо
- 10. Необходимо ли ускорить амперсанд?
- 11. ли функция объекта необходимо
- 12. Необходимо ли освободить объект?
- 13. производительности необходимо использовать совокупный N1QL
- 14. JDK утверждают, что необходимо использовать?
- 15. Как необходимо использовать фильтры PHP?
- 16. Необходимо использовать IConvertible в WinRT
- 17. Сколько питона необходимо использовать SimpleCV?
- 18. Необходимо использовать BOOL * вместо BOOL
- 19. WPF Multibinding - необходимо использовать Relaycommand
- 20. Необходимо ли использовать таблицы для электронных писем в формате HTML?
- 21. Необходимо ли использовать 2 холста для обработки видео html5?
- 22. Необходимо ли JavaScript, чтобы узнать, использовать все функции HTML 5?
- 23. может ли приложение использовать часы, если это необходимо?
- 24. Нормально ли использовать многие бизнес-исключения, если необходимо?
- 25. Необходимо ли использовать мост доступа Java до использования DLL?
- 26. Kohana: Необходимо ли проверить, определено ли SYSPATH?
- 27. Необходимо ли очищать PrintWriter/PrintStream?
- 28. Когда необходимо использовать классы в PHP
- 29. Необходимо использовать идентификатор для всех элементов html?
- 30. необходимо использовать db: migrate for working
Вы можете найти [это прочитанное] (http://www.javapractices.com/topic/TopicAction.do?Id=71) интересное. – m0skit0
Вопросы основаны на ложной посылке. – EJP
Возможный дубликат [клонирование объектов с помощью реализующего клонированного интерфейса] (http://stackoverflow.com/questions/8192223/object-cloning-with-out-implementing-cloneable-interface) – jlordo