Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe eine klasse mit x attributen. ist es möglich diese komplet zu kopieren incl allen werten ohne das ich in der clone methode die werte von "hand" vom orginal an die kopie übergeben muss?
ich habe hier aus dem inet diesen code für einen deep clone gefunden , der springt mir aber in der 7 zeile gleich in die exception behandlung.
Code:
Experiment deepCopy=null;
try{
// ObjectOutputStream erzeugen
ByteArrayOutputStream bufOutStream = new ByteArrayOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(bufOutStream);
// Objekt im byte-Array speichern
outStream.writeObject(this.exp);
outStream.close();
// Pufferinhalt abrufen
byte[] buffer = bufOutStream.toByteArray();
// ObjectInputStream erzeugen
ByteArrayInputStream bufInStream = new ByteArrayInputStream(buffer);
ObjectInputStream inStream = new ObjectInputStream(bufInStream);
// Objekt wieder auslesen
deepCopy = (Experiment)inStream.readObject();
}catch(IOException io){} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
return deepCopy;
Hi,
also das Kopieren von Objekten beherbergt einige Tücken.
Zuerst mußt Du wissen das man zwischen primitiven Datentypen und komplexen Datentypen unterscheidet.
Primitive Datentypen:
z.B. int, double, char, ...
hierbei wir bei einer Neuzuweisung immer automatisch eine Kopie gemacht.
Komplexe Datentypen:
Wenn hier eine Neuzuweisung stadtfindet, so wird nur die Referenz des Objektes zugewiesen.
z.B.
String str1 = "Hallo";
String str2 = str1;
str1 und str2 zeigen beide auf den gleichen Bereich im Speicher. Dies will man ja bei einer Kopie nicht!!!
Code:
public class Ball {
private int durchmesser = 50;
private String name = "BallNummer1";
public Ball(int durchmesser, String name) {
super();
// TODO Auto-generated constructor stub
this.durchmesser = durchmesser;
this.name = name;
}
protected Object clone() throws CloneNotSupportedException {
return new Ball(this.durchmesser, new String(this.name));
}
}
erzeugst du ein Ball-Objekt und rufst jetzt die methode clone auf, bekommst du ein neues Objekt zurück, welche komplett neue Speicherbereiche nutzt.
Implementiert this.exp denn auch Serializable? Und welche Exception wird denn genau geschmissen? Auch immer wieder eine interessante Frage beim Lösen von Fehlern.
Interessant ... ich hab das doch grad erst implementiert... sowohl ein Serializable als auch ein ReflectionCopier die jeweils ein beliebiges Objekt deep-copien können.
Guckst du hier: www.tu-bs.de/~y0016815/src/Copier.zip
beim obigen von dir geposteten Code... catch doch einfach alle Exceptions und mach darüber nen printStackTrace, dann siehst du am Ende auch was geworfen wurde :