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?

3voto

Amir Hossein Ghasemi Punkte 15079
public class MyClass implements Cloneable {

private boolean myField= false;
// und andere Felder oder Objekte

public MyClass (){}

@Override
public MyClass clone() throws CloneNotSupportedException {
   try
   {
       MyClass clonedMyClass = (MyClass)super.clone();
       // Wenn Sie benutzerdefinierte Objekte haben, müssen Sie hier ein neues erstellen
       return clonedMyClass ;
   } catch (CloneNotSupportedException e) {
       e.printStackTrace();
       return new MyClass();
   }

  }
}

und in deinem Code:

MyClass myClass = new MyClass();
// arbeite mit diesem Objekt
MyClass clonedMyClass = myClass.clone();

3 Stimmen

Es hat keinen Sinn, "throws CloneNotSupportedException" in der Deklaration zu setzen, wenn Sie die Ausnahme abfangen und sie nicht weitergeben. Sie können es also einfach entfernen.

1voto

Sie können versuchen, Cloneable zu implementieren und die clone()-Methode zu verwenden. Wenn Sie die Klonmethode verwenden, sollten Sie jedoch standardmäßig IMMER die public Object clone()-Methode von Object überschreiben.

1voto

Lars Bohl Punkte 991

Wenn Sie dem Quellcode eine Annotation hinzufügen können, kann ein Annotationsprozessor oder Codegenerator wie dieser verwendet werden.

import net.zerobuilder.BeanBuilder

@BeanBuilder
public class DummyBean { 
  // bean stuff
}

Eine Klasse DummyBeanBuilders wird generiert, die eine statische Methode dummyBeanUpdater hat, um flache Kopien zu erstellen, genau wie Sie es manuell tun würden.

DummyBean bean = new DummyBean();
// Einige Setter aufrufen ...
// Nun eine Kopie erstellen
DummyBean copy = DummyBeanBuilders.dummyBeanUpdater(bean).done();

1voto

Ngima Sherpa Punkte 1044

Verwendung von Kotlin-Erweiterungsfunktionen

fun  T.duplizieren(): T? {
    var kopieObjekt: T? = null
    try {
        val byteArrayOutputStream = ByteArrayOutputStream()
        val objectOutputStream = ObjectOutputStream(byteArrayOutputStream)
        objectOutputStream.writeObject(this)
        objectOutputStream.flush()
        objectOutputStream.close()
        byteArrayOutputStream.close()
        val byteData = byteArrayOutputStream.toByteArray()
        val byteArrayInputStream = ByteArrayInputStream(byteData)
        try {
            kopieObjekt = ObjectInputStream(byteArrayInputStream).readObject() as T
        } catch (e: ClassNotFoundException) {
            e.printStackTrace()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return kopieObjekt
}

Anwendungsfall

var objekt = Any()
var duplikatObjekt = objekt.duplizieren()

Java

 T copyObject(T sourceObject) {

    T copyObject = null;

    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(sourceObject);
        objectOutputStream.flush();
        objectOutputStream.close();
        byteArrayOutputStream.close();
        byte[] byteData = byteArrayOutputStream.toByteArray();
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteData);
        try {
            copyObject = (T) new ObjectInputStream(byteArrayInputStream).readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return copyObject;
}

Anwendungsfall

Object object = new Object();
Object duplicateObject = copyObject(object);

\==============================================

Kotlin Update

Wenn Sie eine Datenklasse verwenden, haben Sie eine Kopiermethode, die die Kotlin-Datenklasse kopiert. Das Tolle ist, dass Sie auch einige Werte übergeben können, um das Objekt mit einer neuen Kopie zu modifizieren. Ich würde diese Methode empfehlen.

Beispiel:

//Klasse

data class TestModel(val title: String, var subtitle: String)

Anwendungsfall

val testClass = TestModel("Testtitel", "Testuntertitel")

val newInstance = testClass.copy(subtitle = "neuer Untertitel für die Kopie")

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