2013-05-04 4 views
0

Я читал везде, что если я вызову clone() без реализации Cloneable interface, я получу CloneNotSupportedException. Если я реализую метод clone в классе, который не реализует Cloneable, я все равно могу вызвать исключение clone() без исключения. Я имею в виду, что реализация Cloneable не имеет значения. Пожалуйста, уточните ........Необходимо ли использовать Clonable?

+0

Вы можете найти [это прочитанное] (http://www.javapractices.com/topic/TopicAction.do?Id=71) интересное. – m0skit0

+1

Вопросы основаны на ложной посылке. – EJP

+0

Возможный дубликат [клонирование объектов с помощью реализующего клонированного интерфейса] (http://stackoverflow.com/questions/8192223/object-cloning-with-out-implementing-cloneable-interface) – jlordo

ответ

4

Реализация интерфейса Cloneable просто сообщает программисту, что этот объект должен иметь допустимый метод клонирования.

Если вы смотрели на Cloneable интерфейса вы найдете комментарий, который выглядит, как этот

Обратите внимание, что этот интерфейс делает не содержать клон метода. Таким образом, невозможно клонировать объект только по в силу того, что он реализует этот интерфейс. Даже если метод клонирования рефлексивно вызван, нет никакой гарантии, что он добьется успеха .

Клонируемый интерфейс - это всего лишь практика программирования, которую программист должен соблюдать, если они добавляют реализацию для клонирования.

-2

Ваш класс унаследовал защищенный метод clone() (и он может создать мелкую копию вашего объекта) из Object. Однако, чтобы получить доступ к этому методу вне определения вашего класса, вам необходимо пометить свой класс как Cloneable, а значит, и реализацию.

В примере, который вы указали, если вы создали метод с той же сигнатурой, что и clone(), реализация Cloneable просто не имеет значения для компилятора, поскольку он получит доступ к запрошенному методу, поэтому реализация Cloneable будет просто эмпирической. Тем не менее, я предлагаю вам придерживаться подхода с хорошей практикой.

+0

", чтобы получить доступ к этому методу вне определения вашего класса, вы должны пометить свой класс как «Cloneable». Доступ к вашему методу зависит только от спецификаторов доступа, которые вы применяете к вашему методу. Реализация «Cloneable» абсолютно не имеет к этому отношения. – newacct

+0

Что вы говорите абсолютно правильно, если вы определили clone() в своем классе. Однако, если вы не реализуете Cloneable и не переопределяете этот метод, вы не можете получить доступ к нему за пределами, потому что он неявно защищен. Возьмем, например: public class A {}. Вы можете вызвать клон изнутри, но не тогда, когда у вас есть экземпляр (например, A a = new A(); a.clone() -> это не сработает, но открытый класс A {public void test() {this .clone()}} будет). Возможно, я не смог объяснить, что я на самом деле имел в виду. Пожалуйста, извините мой ржавый английский. Кроме того, если я не понял, что вы имели в виду, я открыт для дальнейших объяснений. –

+0

Вы можете реализовать открытый метод 'clone()', а не реализовывать 'Cloneable'. Метод будет доступен, потому что вы его внедрили. И наоборот, вы не можете реализовать общедоступный метод 'clone()' и реализовать 'Cloneable'. Этот метод не будет доступен за пределами вашего класса, потому что вы его не реализовали. Реализация «Cloneable» не имеет значения. – newacct

3

Я читал везде, что если я вызову clone() без реализации Cloneable interface, я получу CloneNotSupportedException.

Правильно, если речь идет об Object.clone().

Если я реализую метод clone в классе, который не реализует Cloneable, я все равно могу вызвать исключение clone() без исключения.

Нет, вы не можете, если мы говорим об Object.clone().

Я имею в виду, что реализация Cloneable не имеет значения.

Да, так оно и есть. Возможно, ваш класс наследуется от класса, который уже реализует Cloneable. Не видя никакого кода, невозможно понять, как вы пришли к этому заблуждению.

Просьба уточнить.

Не о чем говорить. Вы ошибаетесь. Вот и все.

+0

Это пример класса, не реализующего Cloneable, который вызывает его, не вызывая исключения. 'public class Cloneer { public Cloneer clone() { return new Cloneer(); } public static void main (String [] args) { (new Cloneer()). Clone(); } } ' – FDinoff

+0

Это пример класса, который не вызывает Object.clone(), поэтому ни один из побочных эффектов, указанных для Object.clone(), не применяется к нему, включая NotCloneableException. Я предлагаю вам прочитать Джавадока. Не настоящий вопрос. – EJP

+0

Может быть, вам следует объяснить, что вы думаете о путанице? – FDinoff

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