Причина, по которой "конвенция" заключается в вызове super.clone()
, заключается в том, чтобы гарантировать, что конечный тип клонированного объекта соответствует клонируемому объекту. Например, если вы создаете свой собственный новый DoubleLinkedList
в методе clone()
, это хорошо, пока это хорошо, но позже, если подкласс не сможет переопределить clone()
, он в итоге вернет клон, который является DoubleLinkedList
вместо свой собственный класс. (Он также не сможет клонировать свои дополнительные поля, если таковые имеются, возможно!, Поэтому существуют большие проблемы.)
В этом смысле предпочтителен обычный метод, и он действительно неуклюж.
Обе реализации, однако, имеют похожую проблему: вы не копируете структуры данных. Клон всего лишь мелкий полицейский. Это, вероятно, не то, что ожидает звонящий. Вам нужно будет пройти и заменить каждое значение в DoubleLinkedList
клоном значения, а также для других не примитивных полей.
В этом смысле обычный метод даст неправильный результат! Тебе нужен третий путь. Ваш первый метод, вероятно, почти работает, за исключением того, что вам нужно добавить element.clone()
например.