2013-05-02 14 views
8

Ich suchte nach Tutorials online über Java-Klonen, aber nur die Nachteile zu klonen() und nichts über die Vorteile. Ich würde gerne einige der Vorteile von Java clone() kennenlernen.Vorteile von Java Cloning

Antwort

10

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, 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 behandeln 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 weiterer Anwendungsfall, den ich mag, ist, wenn ich eine Klasse als Hintergrundspeicher für eine GUI verwenden und diese GUI eine Schaltfläche zum Zurücksetzen 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 Vererbungsrahmenwerk verursachen und ansonsten leichtgewichtige Datenklassen auffüllen, so dass ich kein Objekt klonbar machen würde, solange es keine geschäftlichen Anforderungen dafür gäbe.

3

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, vor allem in Bezug auf die schrecklichen Auswirkungen, die es auf das Design Ihrer Klassen hat. Josh Bloch hat einen ganzen Abschnitt darüber, warum Sie clone() oder Cloneable nicht in seinem Buch Effektiv Java verwenden sollten, kurz zusammengefasst in einer interview.

Die allgemeine Empfehlung ist, 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: recommended solution for deep cloning/copying an instance.

0

Object.clone() hat viele Design-Probleme, aber es ist immer noch die beliebteste und einfachste Möglichkeit, Objekte zu kopieren. Einige Vorteile mit clone() sind

  • Es ist der einfachste Weg, das Klonen selbst zu implementieren, wenn für uraltes Projekte, Sie müssen nur eine Elternklasse definieren, implementieren klonbar darin, liefern die Definition von clone() Methode und Sie sind bereit, jedes Kind Ihrer Eltern wird die Klonfunktion erhalten.
  • Klonen erfordert sehr wenig Codezeile, nur eine abstrakte Klasse mit 4 oder 5 Zeilen langen clone() - Methode, wenn Sie keine tiefe Kopie benötigen.
  • Klonen ist der schnellste Weg zum Kopieren von Arrays.
  • Ab Version 1.5 gibt der aufrufende Klon für ein Array ein Array zurück, dessen Kompilierungszeittyp mit dem des zu klonenden Arrays identisch ist. Dies bedeutet, dass das Aufrufen von Klonen auf Arrays kein Typcasting erfordert.

können Sie lesen Sie mehr auf Java Cloning - Copy Constructor versus Cloning