Вы обязательно должны использовать 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будет немного более выразительным.