Ich suchte nach Tutorials online über Java-Klonen, fand aber nur die Nachteile zu klonen () und nichts über die Vorteile. Ich würde gerne einige der Vorteile von Java clone () kennenlernen.
Klonen hat seinen Nutzen sicherlich. Stellen Sie sich eine beliebige Art von Geschäftsanwendung vor, in der Sie Datensätze von Daten haben, die in Objekten dargestellt sind und die Sie als "Speichern unter" (Duplizieren und Umbenennen) speichern können. Wenn diese Daten in einem Objekt enthalten sind, das die Cloneable-Schnittstelle implementiert, können Sie das Original klonen und es mit den neuen Informationen aktualisieren.
Dies ist besser als das Erstellen einer neuen Objektinstanz und das explizite Kopieren aller Daten. Einige Leute adressieren dies mit Hilfsklassen und Methoden, die das Kopieren ausführen, aber dann haben Sie die Informationen, die erforderlich sind, um eine Klasse außerhalb der Klasse selbst zu kopieren, was eine schlechte OO-Programmierung ist.
Ein anderer Anwendungsfall, den ich mag, ist, wenn ich eine Klasse als Hintergrundspeicher für eine GUI benutze und diese GUI eine Reset-Schaltfläche hat. Wenn die GUI initialisiert wird, klone ich das Hintergrundspeicherobjekt. Wenn der Benutzer dann auf Zurücksetzen drückt, reinitialisiere ich einfach die GUI auf die Werte im Klonobjekt, anstatt herauszufinden, welche Informationen sie möglicherweise geändert haben, oder eine neue Kopie der ursprünglichen Informationen aus dem Speicher zu erhalten. Es gibt viele Anwendungen, sicherlich.
Aber wie Sie wissen, kann das Klonen Probleme in einem Vererbungs-Framework verursachen und ansonsten leichtgewichtige Datenklassen auffüllen, so dass ich kein Objekt klonbar machen würde, solange es keine Geschäftsanforderungen dafür gäbe.
Ich denke, der Grund, warum Sie Probleme haben, etwas über die Vorteile des Klonens zu finden, ist, dass der Vorteil implizit ist: eine (angeblich) einfache Möglichkeit zu haben, ein exaktes Duplikat des ursprünglichen Objekts zu erstellen.
Aber leider hat Javas eingebauter Klonierungsmechanismus über clone () und Cloneable zu viele Nachteile zu berücksichtigen, hauptsächlich in Bezug auf die schrecklichen Auswirkungen, die es auf das Design Ihrer Klassen hat. Josh Bloch hat einen ganzen Abschnitt darüber, warum du clone () oder Cloneable nicht in seinem Buch Effektives Java verwenden solltest, das kurz in Interview .
Die allgemeine Empfehlung lautet, einen Kopierkonstruktor anstelle von clone () oder Cloneable zu verwenden, obwohl Sie immer noch entscheiden müssen, ob eine seichte oder tiefe Kopie geeignet ist. Sie können auch eine Serialisierungs-API wie Serializable oder JAXB sowie verschiedene Klon-Bibliotheken verwenden, um einen tiefen Klon zu erstellen. Sie können eine sehr nette Diskussion in einer verwandten Frage finden, Java: empfohlene Lösung für das tiefe Klonen / Kopieren einer Instanz .
Object.clone () hat viele Design-Probleme, ist aber immer noch die beliebteste und einfachste Art Objekte zu kopieren. Einige Vorteile mit clone () sind
Sie können mehr über Java Cloning lesen - Konstruktor gegen Klonen kopieren