Java Tipp 76 Eine Alternative zu der tiefen Kopie Technik, Javaworld

eine tiefe Kopie eines Objekt Der Implementierung kann eine Lernerfahrung sein - Sie erfahren, dass Sie es nicht tun wollen! Wenn das betreffende Objekt zu anderen komplexen Objekten verweist, die wiederum auf anderen, dann kann diese Aufgabe in der Tat entmutigend sein. Traditionell muss jede Klasse in dem Objekt einzeln die klonbar Schnittstelle zu implementieren inspiziert und bearbeitet werden und seinen Klon () Methode, um außer Kraft setzen eine tiefe Kopie von sich selbst sowie die darin enthaltenen Objekte zu machen. Dieser Artikel beschreibt eine einfache Technik, anstelle dieser zeitaufwendige konventionellen tiefen Kopie zu verwenden.

Das Konzept der tiefen Kopie

Um zu verstehen, was eine tiefe Kopie ist, lassen Sie uns zunächst einen Blick auf das Konzept der flachen Kopieren.

Abbildung 1. Der ursprüngliche Zustand der obj1

Wenn eine flache Kopie auf obj1 ausgeführt. dann wird sie kopiert, aber die darin enthaltenen Objekte sind nicht, wie in Abbildung 2 dargestellt.

Abbildung 2. Nach einer flachen Kopie von obj1

Eine tiefe Kopie tritt auf, wenn ein Objekt zusammen mit den Objekten, auf die er sich bezieht kopiert wird. Abbildung 3 zeigt obj1, nachdem eine tiefe Kopie hat es ausgeführt worden ist. Nicht nur hat obj1 kopiert worden, aber die darin enthaltenen Objekte ebenfalls kopiert wurden.

Abbildung 3. Nach einer tiefen Kopie von obj1

Wenn eine dieser enthaltenen Objekte selbst Objekte enthält, dann, in einer tiefen Kopie, werden diese Objekte als auch, kopiert und so weiter, bis der gesamte Graph überquert wird und kopiert. Jedes Objekt ist verantwortlich für das Klonieren selbst über seinen Klon () Methode. Die Standard-Klon () Methode, geerbt von Object. macht eine flache Kopie des Objekts. Um eine tiefe Kopie, zusätzliche Logik zu erreichen, muss hinzugefügt werden, dass explizit fordert alle Objekte clone () Methoden, die wiederum ihre enthaltenen Objekte nennen enthaltenen clone () Methoden, und so weiter. Diese richtige bekommen kann schwierig und zeitaufwendig sein, und ist selten Spaß. Um die Sache noch komplizierter zu machen, wenn ein Objekt nicht direkt geändert werden kann und dessen Klon () Methode erzeugt eine flache Kopie, dann muss die Klasse erweitert werden, der Klon () -Methode außer Kraft gesetzt, und diese neue Klasse verwendet anstelle der alt. (Zum Beispiel ist Vector enthalten nicht die Logik, die für eine tiefe Kopie.) Und wenn Sie Code schreiben möchten, dass die Frage der Laufzeit bis aufschiebt, ob eine tiefe oder flache Kopie ein Objekt zu machen, du bist in einem noch komplizierte Situation. In diesem Fall muss für jedes Objekt zwei Kopierfunktionen sein: ein für eine tiefe Kopie und ein für ein flach. Schließlich, auch wenn das Objekt tief mehrere Verweise auf ein anderes Objekt kopiert wird, enthält, sollte das letztere Objekt noch nur einmal kopiert werden. Dies verhindert, dass die Verbreitung von Gegenständen, und leitet die besondere Situation ab, in dem ein kreisförmigen Bezug eine Endlosschleife von Kopien erzeugt.

Serialisierung

Komplette Kopie Serialisierung mit

Die Schritte zur Herstellung einer tiefen Kopie Serialisierung verwenden, sind:

Stellen Sie sicher, dass alle Klassen in dem Objekt Graph serializable sind.

Erstellen Sie Eingangs- und Ausgangsströme.

Verwenden, um die Eingangs- und Ausgangsströme Objekteingang zu schaffen und Ausgangsströme Objekt.

Übergeben Sie das Objekt, das Sie zu dem Objekt Ausgabestrom kopieren möchten.

  • Lesen Sie das neue Objekt aus dem Objekteingangsstrom und wirft es zurück in der Klasse des Objekts versandt.












  • Ein einfacher Weg, wenn Sie irgendwelche nonserializable Klassen in einem Diagramm des Objekts haben, um herauszufinden, ist anzunehmen, dass sie alle serializable und laufen ObjectCloner ‚s deepcopy () -Methode auf sie sind. Wenn es ein Objekt, dessen Klasse nicht serialisiert, wird eine java.io.NotSerializableException geworfen werden, Sie sagen, welche Klasse das Problem verursacht hat.

    Ein schnelles Implementierungsbeispiel wird unten gezeigt. Es schafft ein einfaches Objekt, v1. Das ist ein Vektor, der einen Punkt enthält. Diese Aufgabe wird dann ausgedruckt seinen Inhalt zu zeigen. Das ursprüngliche Objekt, v1. wird dann auf ein neues Objekt, Vnew kopiert. welches gedruckt wird zu zeigen, dass es den gleichen Wert wie v1 enthält. Als nächstes werden die Inhalte von v1 verändert, und schließlich werden beide v1 und Vnew gedruckt, so dass ihre Werte verglichen werden können.

    Um die tiefe Kopie (Linie A) aufzurufen, führen Sie java.exe Driver1 tief. Wenn die tiefe Kopie läuft, erhalten wir den folgenden Ausdruck:

    Dies zeigt, dass, wenn der Original-Point. p1. geändert wurde, blieb der neue Punkt erstellt als Folge der tiefen Kopie davon unberührt, da wurde die gesamte Grafik kopiert. Zum Vergleich ruft die flache Kopie (Linie B) durch Ausführen java.exe Driver1 seicht. Wenn die flache Kopie läuft, erhalten wir den folgenden Ausdruck:

    Dies zeigt, dass, wenn der ursprüngliche Punkt geändert wurde, der neue Punkt wurde ebenfalls geändert. Dies ist auf die Tatsache zurückzuführen, dass die flache Kopie erstellt Kopien nur der Referenzen, und nicht der Objekte, auf die sie sich beziehen. Dies ist ein sehr einfaches Beispiel, aber ich denke, es zeigt das, äh, Punkt.

    Umsetzungsfragen

    Nun habe ich alle Tugenden der tiefen Kopie mit Serialisierung gepredigt, wir uns einige Dinge sehen zu achten.

    Der erste Problemfall ist eine Klasse, die nicht serialisierbar ist und nicht bearbeitet werden kann. Dies könnte passieren, zum Beispiel, wenn Sie eine Drittanbieter-Klasse verwenden, die nicht mit dem Quellcode kommt. In diesem Fall können Sie es erweitern, die erweiterte Klasse machen Serializable implementieren. alle (oder alle) erforderlichen Konstrukteuren hinzufügen, die nur das dazugehörige Superkonstruktor nennen, und verwenden Sie diese neue Klasse überall die alte tat (hier ist ein Beispiel dafür).

    Millisekunden tiefe Kopie eine einfache Klasse Graph n-mal

    Schlussfolgerung

    Die Implementierung tiefe Kopie eines komplexen Objektgraphen kann eine schwierige Aufgabe sein. Die Technik, die oben gezeigt ist eine einfache Alternative zu dem herkömmlichen Verfahren der Klons () Methode für jedes Objekt in der graphischen Darstellung zu überschreiben.

    Dave Miller ist leitender Architekt mit dem Beratungsunternehmen Javelin Technologie, wo er auf Java und Internet-Anwendungen funktioniert. Er hat für Unternehmen wie Hughes, IBM arbeitete, Nortel und MCIWorldCom auf objektorientierte Projekte und hat sich ausschließlich mit Java in den letzten drei Jahren gearbeitet.

    Erfahren Sie mehr zu diesem Thema

    Folgen Sie alles von Javaworld