Müssen Sie unbedingt verwenden clone
? Die meisten Leute sind sich einig, dass Java clone
kaputt ist.
Josh Bloch über Design - Kopierkonstruktor versus Klonen
Wenn Sie den Artikel über das Klonen in meinem Buch gelesen haben, insbesondere wenn Sie zwischen den Zeilen lesen, werden Sie wissen, dass ich denke, dass er clone
zutiefst gebrochen ist. [...] Es ist eine Schande, Cloneable
die kaputt ist, aber es passiert.
Weitere Informationen zu diesem Thema finden Sie in seinem Buch Effective Java 2nd Edition, Punkt 11: Mit Bedacht clone
überschreiben . Er empfiehlt stattdessen die Verwendung eines Kopierkonstruktors oder einer Kopierfabrik.
Er fuhr fort, Seiten von Seiten darüber zu schreiben, wie Sie implementieren sollten, wenn Sie das Gefühl haben, dass Sie es müssen clone
. Aber er schloss damit:
Ist all diese Komplexität wirklich notwendig? Selten. Wenn Sie eine Klasse erweitern , dass Geräte Cloneable
, Sie kaum eine andere Wahl haben , aber eine gut erzogene zu implementieren clone
Methode. Andernfalls ist es besser, alternative Mittel zum Kopieren von Objekten bereitzustellen oder die Funktion einfach nicht bereitzustellen .
Der Schwerpunkt lag bei ihm, nicht bei mir.
Da Sie klargestellt haben, dass Sie keine andere Wahl haben, als zu implementieren clone
, können Sie in diesem Fall Folgendes tun: Stellen Sie sicher, dass MyObject extends java.lang.Object implements java.lang.Cloneable
. Wenn dies der Fall ist, können Sie garantieren, dass Sie NIEMALS einen fangen werden CloneNotSupportedException
. Werfen, AssertionError
wie einige vorgeschlagen haben, erscheint vernünftig, aber Sie können auch einen Kommentar hinzufügen, der erklärt, warum der catch-Block in diesem speziellen Fall niemals eingegeben wird .
Alternativ können Sie, wie andere ebenfalls vorgeschlagen haben, möglicherweise implementieren, clone
ohne aufzurufen super.clone
.
Cloneable
ist das Auslösen einerAssertionError
Ebene und nicht nur einer EbeneError
etwas ausdrucksvoller.