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?

10voto

Pierre Punkte 7297

Alternative zu egaga's Konstruktor-Methode zum Kopieren. Sie haben wahrscheinlich bereits ein POJO, also fügen Sie einfach eine weitere Methode copy() hinzu, die eine Kopie des initialisierten Objekts zurückgibt.

class DummyBean {
    private String dummyStr;
    private int dummyInt;

    public DummyBean(String dummyStr, int dummyInt) {
        this.dummyStr = dummyStr;
        this.dummyInt = dummyInt;
    }

    public DummyBean copy() {
        return new DummyBean(dummyStr, dummyInt);
    }

    //... Getter & Setter
}

Wenn Sie bereits ein DummyBean haben und eine Kopie möchten:

DummyBean bean1 = new DummyBean("peet", 2);
DummyBean bean2 = bean1.copy(); // <-- Erstelle Kopie von bean1 

System.out.println("bean1: " + bean1.getDummyStr() + " " + bean1.getDummyInt());
System.out.println("bean2: " + bean2.getDummyStr() + " " + bean2.getDummyInt());

//Ändere bean1
bean1.setDummyStr("koos");
bean1.setDummyInt(88);

System.out.println("bean1: " + bean1.getDummyStr() + " " + bean1.getDummyInt());
System.out.println("bean2: " + bean2.getDummyStr() + " " + bean2.getDummyInt());

Ausgabe:

bean1: peet 2
bean2: peet 2

bean1: koos 88
bean2: peet 2

Aber beide funktionieren gut, letztendlich liegt es an Ihnen...

10voto

Jon Bringhurst Punkte 1330

Hier ist eine anständige Erklärung für clone(), falls Sie sie benötigen...

Hier: clone (Java-Method)

10voto

Cojones Punkte 1899

Verwenden Sie ein Deep-Cloning-Dienstprogramm:

SomeObjectType copy = new Cloner().deepClone(someObject);

Dies kopiert jedes Java-Objekt tief, überprüfen Sie es unter https://github.com/kostaskougios/cloning

1 Stimmen

Hat bei mir nicht funktioniert, als ich eine benutzerdefinierte Klasse verwendet habe. Es wurde folgende Ausnahme erhalten: java.lang.NoClassDefFoundError: sun.reflect.ReflectionFactory

9voto

bruno conde Punkte 47059

Ja. Du musst dein Objekt Deep Copy.

8voto

tuhin47 Punkte 3704

Verwenden Sie gson zum Duplizieren eines Objekts.

public static T copyObject(Object object){
    Gson gson = new Gson();
    JsonObject jsonObject = gson.toJsonTree(object).getAsJsonObject();
    return gson.fromJson(jsonObject,(Type) object.getClass());
}

Angenommen, ich habe ein Objekt Person. Also

Person copyPerson = copyObject(person);

Hinweis: Die Leistung ist viel langsamer.

1 Stimmen

Das ist eine gute Idee!

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