Müssen Sie unbedingt verwenden clone? Die meisten Leute sind sich einig, dass Java clonekaputt 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 clonezutiefst gebrochen ist. [...] Es ist eine Schande, Cloneabledie 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 cloneMethode. 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, AssertionErrorwie 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, cloneohne aufzurufen super.clone.
Cloneableist das Auslösen einerAssertionErrorEbene und nicht nur einer EbeneErroretwas ausdrucksvoller.