Czy absolutnie musisz użyć clone? Większość ludzi zgadza się, że Java clonejest zepsuta.
Josh Bloch on Design - Copy Constructor versus Cloning
Jeśli przeczytałeś artykuł o klonowaniu w mojej książce, zwłaszcza jeśli czytasz między wierszami, będziesz wiedział, że moim zdaniem clonejest głęboko zepsuty. […] Szkoda, że Cloneablejest zepsuty, ale się zdarza.
Możesz przeczytać więcej dyskusji na ten temat w jego książce Effective Java 2nd Edition, Item 11: Override clonerozsądnie . Zamiast tego zaleca użycie konstruktora kopiującego lub fabryki kopiowania.
Następnie napisał kilka stron o tym, jak, jeśli uważasz, że musisz, powinieneś wdrażać clone. Ale zakończył tym:
Czy wszystkie te zawiłości są naprawdę konieczne? Rzadko. Jeśli rozszerzasz klasę, która implementuje Cloneable, nie masz innego wyboru, jak zaimplementować dobrze zachowaną clonemetodę. W przeciwnym razie lepiej będzie zapewnić alternatywne sposoby kopiowania obiektów lub po prostu nie zapewnić takiej możliwości .
Nacisk był jego, nie mój.
Ponieważ jasno wskazałeś, że nie masz innego wyboru, jak tylko wdrożyć clone, oto, co możesz zrobić w tym przypadku: upewnij się, że MyObject extends java.lang.Object implements java.lang.Cloneable. W takim przypadku możesz zagwarantować, że NIGDY nie złapiesz CloneNotSupportedException. Rzucanie, AssertionErrorjak sugerowali niektórzy, wydaje się rozsądne, ale możesz również dodać komentarz wyjaśniający, dlaczego blok catch nigdy nie zostanie wprowadzony w tym konkretnym przypadku .
Alternatywnie, jak sugerowali inni, możesz być może zaimplementować clonebez wywoływania super.clone.
Cloneableto rzucanieAssertionErrorzamiast zwykłego zwykłegoErrorjest nieco bardziej wyraziste.