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