Вы обязательно должны использовать clone
? Большинство людей согласны с тем, что Java не clone
работает.
Джош Блох о дизайне - Конструктор копирования против клонирования
Если вы читали статью о клонировании в моей книге, особенно если вы читаете между строк, вы поймете, что, на мой взгляд, clone
она глубоко сломана. [...] Жалко, что Cloneable
ломается, но бывает.
Вы можете прочитать более подробное обсуждение этой темы в его книге « Эффективное Java 2-е издание», пункт 11: clone
разумное переопределение . Он рекомендует вместо этого использовать конструктор копирования или фабрику копирования.
Он продолжал писать страницы о том, как, если вы чувствуете, что вы должны, вы должны реализовать clone
. Но он закончил этим:
Неужели все эти сложности необходимы? Редко. Если вы расширяете класс, который реализует Cloneable
, у вас мало выбора, кроме как реализовать хорошо управляемый clone
метод. В противном случае вам лучше предоставить альтернативные средства копирования объектов или просто не предоставлять такую возможность .
Акцент был сделан на его, а не на моем.
Поскольку вы дали понять, что у вас нет другого выбора, кроме как реализовать clone
, вот что вы можете сделать в этом случае: убедитесь в этом MyObject extends java.lang.Object implements java.lang.Cloneable
. Если это так, то вы можете гарантировать, что НИКОГДА не поймаете CloneNotSupportedException
. Бросок, AssertionError
как некоторые предлагали, кажется разумным, но вы также можете добавить комментарий, объясняющий, почему блок catch никогда не будет введен в этом конкретном случае .
В качестве альтернативы, как предлагали другие, вы, возможно, можете реализовать clone
без вызова super.clone
.
Cloneable
тогда бросаниеAssertionError
простого, а не простогоError
будет немного более выразительным.