Вам абсолютно потрібно користуватися clone
? Більшість людей сходяться на думці, що Java clone
зламана.
Джош Блох про дизайн - конструктор копіювання проти клонування
Якщо ви прочитали предмет про клонування у моїй книзі, особливо якщо ви читаєте між рядків, то знатимете, що я думаю, що clone
це глибоко зламано. [...] Сором, що Cloneable
порушується, але трапляється.
Ви можете прочитати більше обговорень на цю тему в його книзі « Ефективна Java 2-е видання, пункт 11: Розумно clone
переоцініть . Натомість він рекомендує використовувати конструктор копій або фабрику копій.
Він продовжував писати сторінки сторінок про те, як, якщо ти вважаєш, що потрібно, потрібно реалізувати clone
. Але він закрив це:
Чи справді всі ці складнощі потрібні? Рідко. Якщо ви розширите клас, який реалізує Cloneable
, у вас є мало іншого вибору, ніж реалізувати добре сприйнятий clone
метод. В іншому випадку вам краще надати альтернативні засоби копіювання об'єктів або просто не забезпечити можливість .
Акцент був його, а не мій.
Оскільки ви зрозуміли, що у вас є малий вибір, ніж здійснити clone
, ось що ви можете зробити в цьому випадку: переконайтеся в цьому MyObject extends java.lang.Object implements java.lang.Cloneable
. Якщо це так, то ви можете гарантувати, що НІКОЛИ не зловите CloneNotSupportedException
. Кидання, AssertionError
як деякі з них запропонували, здається розумним, але ви також можете додати коментар, який пояснює, чому блок ловлі ніколи не буде введений у цьому конкретному випадку .
Крім того, як і інші запропонували, ви можете, можливо, реалізувати clone
без виклику super.clone
.
Cloneable
то кидання,AssertionError
а не просто звичайне,Error
є трохи більш виразним.