Echte Kopie eines Objektes erstellen

Status
Nicht offen für weitere Antworten.
Z

ZAntjeZ

Gast
Hallo,
ich möchte von einem Objekt meiner Klasse eine echte Kopie erstellen, d.h. sie sollen danach völlig unabhängig von einander weiter bearbeitbar sein.
Momentan kann ich zwar eine Kopie erstellen, aber sobald ich in einer der beiden Objekte (Original+Kopie) etwas verändere, dann passiert die Änderung auch in dem anderen Objekt, was darauf zurückzuführen ist, dass ich nur die Referenz kopiert habe. Ich habe deswegen clone() von der Schnittstelle Cloneable überschrieben, aber irgendwie geht das auch nicht.
Mein Quellcode:

Code:
protected Object clone()
	{
		try 
		{
			return super.clone();
		}catch (CloneNotSupportedException e)
		{
			return null;
		}
	}
	
	//Kopieren eines Segments einschließlich seiner Unterobjekte
	public void copy(StructObject child)
	{	
		try
		{
		StructObject so= (StructObject) super.clone();
		so.parent=(StructObject) child.clone();
		//Objekt was kopiert werden soll als ClipObjekt speichern
		setClipObject(so);
		}catch (CloneNotSupportedException e){}
	}

Was mach ich falsch?

Danke für jeden Tipp!

Tschau Antje
 
B

Beni

Gast
aber irgendwie geht das auch nicht.
Eine sehr wage Formulierung...


Angenommen du hast ein Object A und ein Object B:
Code:
public class A{
  public Object clone(){
    return new A();
  }
}
Code:
public class B extends A{
  public Object clone(){
    return super.clone();
  }
}

Wenn du nun ein B clonst, wird ein neues A hergestellt, nicht aber ein neues B (es steht niergends "new B"). D.h. du kriegst keine richtige Kopie...

Du musst in der B.clone-Methode explizit ein neues B herstellen:
Code:
public class B extends A{
  public Object clone(){
    B b = new B();
    b.setDiesesUndJenes( this.getDiesesUndJenes() );
    return b;
  }
}


Ich mach meistens ein Copy-Konstruktor, das erleichert das Kopieren:
Code:
public class A{
  public A(){}
  public A( A original ){
    setBlupp( original.getBlupp() );
  }
  public Object clone(){
    return new A( this );
  }
}
Code:
public class B extends A{
  public B(){}
  public B( B original ){
    super( original );
    setDiesesUndJenes( original.getDiesesUndJenes() );
  }
  public Object clone(){
    return new B( this );
  }
}
 
G

Guest

Gast
Ungefähr so kannst Du Deine Objekte aufbauen, dann geht's.
Code:
public class Foo
{
  private Irgendwas irgendwas;
  ...
  public Foo(Foo foo) {  // Copy-Constructor
    setIrgendwas(foo.getIrgendwas()); 
  }

  public final Irgendwas getIrgendwas() {
    // clone() nur wenn "Mutable", alles adere (immutable und/oder primitive Typen) 
    //direkt zurückgeben
    return (Irgendwas)irgendwas.clone(); 
  }

  public final void setIrgendwas(Irgendwas irgendwas) {
    this.irgendwas = irgendwas;
  }

  protected Object copyInstance(Foo foo) {
    return new Foo(this);
  }

  public final Object clone() {
    return copyInstance(this)  // Kopie zurückgeben
  }
}
 
G

Guest

Gast
Ehmm da fählt noch Cloneable

Code:
public class Foo implements Cloneable
...
 
Z

ZAntjeZ

Gast
Habs probiert, kommt aber ne NullPointer Exception

Code:
private StructObject structObjectS;
	
	//Copy-Konstruktor
	public StructObject(StructObject so)
	{
		setStructObject(so.getStructObject());
	}
	
	public final StructObject getStructObject()
	{
		return (StructObject) structObject.clone();
	}

	public final void setStructObject(StructObject strObj)
	{
		this.structObject=strObj;
	}
	
	protected Object copyInstance(StructObject strObj)
	{
		return new StructObject(this);
	}
	
	public final Object clone()
	{	//Kopie zurückgeben
		return copyInstance(this);
	}


public void copy(StructObject child)
	{	
		try
		{
		StructObject so= (StructObject) super.clone();
		so=(StructObject) child.clone();
		//Objekt was kopiert werden soll als ClipObjekt speichern
		setClipObject(so.parent);
		}catch (CloneNotSupportedException e){} 
		
	}
 
B

Beni

Gast
Es wäre nützlich, wenn du schreiben würdest, wo diese Exception auftritt.
 
Z

ZAntjeZ

Gast
Der Nullpointer komme bei
Code:
    public final StructObject getStructObject()
	{
		return (StructObject) structObject.clone(); //hier kommt die Exception
	}

Einmal kam auch folgende Meldung:

Code:
java.lang.Error: Unresolved compilation problem: 
	structObject cannot be resolved
 
B

Beni

Gast
Dann wird wohl "structObject" null sein (es gibt hier ja keine anderen Variablen).

:arrow: Leg dir eine Instanz dieser Klasse StructObject an, new...
 
G

Guest

Gast
Code:
return (structObject!=null)?(StructObject) structObject.clone():null;
 

foobar

Top Contributor
Das geht auch einfacher:
Code:
public static Object deepCopy(Object o)
{
	try
	{
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		new ObjectOutputStream(baos).writeObject(o);
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		return new ObjectInputStream(bais).readObject();
	}
	catch (IOException e)
	{
		e.printStacktrace();
	}
	catch (ClassNotFoundException e)
	{
		e.printStacktrace();
	}
}
Die Methode deepCopy erstellt eine tiefe Kopie, eines beliebigen Objekts.
 
G

Guest

Gast
Übrigens, alternativ dazu kannst Du das Objekt durch Streams jagen,
dann hast Du auch eine Kopie.
Es setzt aber voraus, dass alle Attribute der Klasse auch Serializable sind.
Code:
public class Foo implements Cloneable, Serializable {
  ...
  public Object clone() {
    try {
      ByteArrayOutputStream buf = new ByteArrayOutputStream();
      ObjectOutputStream out = new ObjectOutputStream(buf);
      out.writeObject(this);
      out.flush();
      out.close();
      ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
      return in.readObject();
    }
    catch(Exception e) {
      return null; // evtl. lieber eine RuntimeException werfen, damit der Aufrufer weiß, was abgeht.
    }
  }
}
 
B

Beni

Gast
Hm, ich frag mich allerdings ob das "durch den Stream jagen" nicht eine ziemliche Geschwindigkeitseinbusse gibt, immerhin wird da kräftig mit Reflection und etc. gearbeitet.
 
G

Guest

Gast
Du hast Recht, es ist auf jeden Fall langsamer. ;)
Aber, wenn es nicht darum geht tausende solcher Objekte zu clonen, dürfte
es egal sein. Wir reden hier von paar Millisekunden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Echte Adressen aus Internet Allgemeine Java-Themen 28
C Best Practice Tiefe Kopie eines Arrays unbekannter Dimension und unbekannten Typs Allgemeine Java-Themen 4
C Methode für tiefe Kopie eines unbekannt (dimensionierten & typisierten) Feldes realisierbar? Allgemeine Java-Themen 7
M Neue Instanz/Kopie einer unbekannten Klasse Allgemeine Java-Themen 7
reibi Kopie einer Liste Allgemeine Java-Themen 4
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
J Collections in Instanzattributen als Kopie übergeben Allgemeine Java-Themen 4
N for (String s : StringArray) : Kopie oder Verweis? Allgemeine Java-Themen 9
M "Kopie" von JLabels werden nicht gezeichnet Allgemeine Java-Themen 10
G Kopie eines FileReader Allgemeine Java-Themen 4
S Tiefe Kopie einer Baumstruktur als statische Methode Allgemeine Java-Themen 8
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
S Vorbereitung eines Praktikums Allgemeine Java-Themen 4
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
M Weiterleiten von empfangenen Nachrichten eines StompSessionHandlers Allgemeine Java-Themen 1
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
H Rename eines Projekts Allgemeine Java-Themen 1
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
Meeresgott Erste Schritte Sourcetree - Git | Suchen eines Commits Allgemeine Java-Themen 2
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
DaCrazyJavaExpert OOP Ansätze und Tipps zum Porgrammieren eines Taschenrechners Allgemeine Java-Themen 25
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
I Verbindung eines Java-Plugins mit Webserver Allgemeine Java-Themen 3
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
G Iteratoren - Wie kann man mithilfe von Iteratoren nur jeden zweiten Wert eines TreeSets ausgeben? Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
B Spalten eines 2d-Arrays Allgemeine Java-Themen 2
M Rechenprogramm eines wissenschaftlichen Taschenrechners Allgemeine Java-Themen 4
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
E Typüberprüfung eines chars Allgemeine Java-Themen 5
H Hilfe bei Erstellung eines Hilfe Fenster bei Tastendruck (F1 bei Win98) Allgemeine Java-Themen 5
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
H Datentypen Typ eines Arrays überprüfen Allgemeine Java-Themen 9
RalleYTN DPI eines Bildes ändern Allgemeine Java-Themen 4
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
K Bestimmten Bereich eines Strings lesen Allgemeine Java-Themen 6
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
O Datentypen Erstellung eines Containers, der verschachtelte Map-Strukturen beherbergen kann Allgemeine Java-Themen 0
A einmalige Ausführung eines Methodenabschnittes Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
L Menge der Buchstaben eines Textes zählen Allgemeine Java-Themen 3
F Teil eines Bildes laden Allgemeine Java-Themen 1
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P Löschen eines keys in einer SortedMap Allgemeine Java-Themen 5
RalleYTN Input/Output URL eines Zip Entry? Allgemeine Java-Themen 2
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
J NullPointerExeption bei Inizialisierung eines Arrays Allgemeine Java-Themen 3
I Setzen und Lesen eines Objektes (Enum?) Allgemeine Java-Themen 10
L Implementierung eines AVT-Baums Allgemeine Java-Themen 2
D Größe der Zahlenkombinationen eines Arrays begrenzen Allgemeine Java-Themen 3
D Objekt entlang eines Funktionsgraphens bewegen Allgemeine Java-Themen 6
B Existenz eines Files max 30 sec prüfen Allgemeine Java-Themen 5
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
thet1983 nach teilen eines Dateinamens suchen Allgemeine Java-Themen 6
T Bezeichnung eines Objektes mit String/int kombinieren Allgemeine Java-Themen 3
Z Auswerten eines eingegeben Termes Allgemeine Java-Themen 13
X Registrierung eines Ecore-Models außerhalb der Eclipse-Umgebung Allgemeine Java-Themen 0
R Instanzen eines Programms Allgemeine Java-Themen 8
I Arbeitsmaterialien eines Softwareentwicklers? Allgemeine Java-Themen 7
L Größe eines Objekts im Arbeitsspeicher Allgemeine Java-Themen 1
D Name eines Nicht-String Objekts ausgeben Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben