Czy absolutnie musisz użyć clone
? Większość ludzi zgadza się, że Java clone
jest 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 clone
jest głęboko zepsuty. […] Szkoda, że Cloneable
jest zepsuty, ale się zdarza.
Możesz przeczytać więcej dyskusji na ten temat w jego książce Effective Java 2nd Edition, Item 11: Override clone
rozsą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ą clone
metodę. 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, AssertionError
jak 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ć clone
bez wywoływania super.clone
.
Cloneable
to rzucanieAssertionError
zamiast zwykłego zwykłegoError
jest nieco bardziej wyraziste.