926 Stimmen

Wie kopiere ich ein Objekt in Java?

Betrachten Sie den folgenden Code:

DummyBean dum = new DummyBean();
dum.setDummy("foo");
System.out.println(dum.getDummy()); // gibt 'foo' aus

DummyBean dumtwo = dum;
System.out.println(dumtwo.getDummy()); // gibt 'foo' aus

dum.setDummy("bar");
System.out.println(dumtwo.getDummy()); // gibt 'bar' aus, aber es sollte 'foo' ausgeben

Also möchte ich dum nach dumtwo kopieren und dum ändern, ohne dumtwo zu beeinflussen. Aber der obige Code tut das nicht. Wenn ich etwas in dum ändere, geschieht die gleiche Änderung auch in dumtwo.

Ich vermute, wenn ich dumtwo = dum sage, kopiert Java nur die Referenz. Gibt es also einen Weg, eine frische Kopie von dum zu erstellen und sie dumtwo zuzuweisen?

7voto

A-Droid Tech Punkte 2221

Geben Sie das Objekt weiter, das Sie kopieren möchten, und erhalten Sie das gewünschte Objekt:

private Object copyObject(Object objSource) {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(objSource);
            oos.flush();
            oos.close();
            bos.close();
            byte[] byteData = bos.toByteArray();
            ByteArrayInputStream bais = new ByteArrayInputStream(byteData);
            try {
                objDest = new ObjectInputStream(bais).readObject();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return objDest;

    }

Jetzt das objDest in das gewünschte Objekt analysieren.

Viel Spaß beim Codieren!

0 Stimmen

Eine gute Lösung, um eine Lösung zu haben. Aber wenn der Zweck des Klonens darin besteht, die Leistung zu verbessern, funktioniert diese Lösung nicht, da sie eine hohe Verarbeitung hat.

7voto

Yishai Punkte 87548

Um das zu erreichen, musst du das Objekt auf irgendeine Weise klonen. Obwohl Java einen Klonmechanismus hat, solltest du ihn nicht verwenden, wenn du nicht musst. Erstelle eine Kopiermethode, die die Kopierarbeit für dich erledigt, und dann mache folgendes:

dumtwo = dum.copy();

Hier findest du weitere Ratschläge zu verschiedenen Techniken, um eine Kopie zu erstellen.

6voto

Tom Hawtin - tackline Punkte 142461

Außer dem expliziten Kopieren gibt es einen weiteren Ansatz: das Objekt unveränderlich zu machen (keine set- oder andere Mutator-Methoden). Auf diese Weise stellt sich die Frage nie. Unveränderlichkeit wird mit größeren Objekten schwieriger, aber auf der anderen Seite drängt es dich dazu, in Richtung der Aufteilung in kohärente kleine Objekte und Komposita zu gehen.

4voto

Mahdi Abdi Punkte 672
class DB {
  private String dummy;

  public DB(DB one) {
    this.dummy = one.dummy; 
  }
}

3voto

Jaime Hablutzel Punkte 5829

Sie können automatisch eine Deep Copy mit XStream erstellen, von http://x-stream.github.io/:

XStream ist eine einfache Bibliothek zum Serialisieren von Objekten in XML und zurück.

Fügen Sie es Ihrem Projekt hinzu (falls Sie Maven verwenden)

    com.thoughtworks.xstream
    xstream
    1.3.1                

Dann

DummyBean dum = new DummyBean();
dum.setDummy("foo");
DummyBean dumCopy = (DummyBean) XSTREAM.fromXML(XSTREAM.toXML(dum));

Mit diesem Code haben Sie eine Kopie, ohne die Notwendigkeit, eine Klon-Schnittstelle zu implementieren.

31 Stimmen

Das Konvertieren von/nach XML erscheint nicht sehr ... elegant. Um es gelinde auszudrücken!

0 Stimmen

Werfen Sie einen Blick auf java.beans.XMLEncoder für eine Standard-Java-API, die auch in XML serialisiert (obwohl nicht genau für Deep-Copy-Zwecke).

3 Stimmen

Verstehen Sie, wie schwer das ist?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X