homedukeOOP mit Java: Kopieren von Verweisen und Objekten Prof. Dr. Uwe Schmidt FH Wedel

Kopieren von Verweisen und Objekten

weiter

weiter

Verweise und Objekte

Referenzen
Zugriffspfade auf Objekte
weiter
merke
mehrere Referenzen = meherer Zugriffspfade

Seiteneffekte:

 
class X {
  public int d;
}
...
X p1,p2;
 
p1   = new X();
p1.d = 42;
p2   = p1;
p2.d = 13;
... p1.d ... // --> 13
weiter
merke
manchmal beabsichtigt
manchmal Fehler
weiter
Beispiel
für fehlerhaftes Verhalten
 
class Point {
 
  int x,y;
 
  Point(int x1int y1) {
    x = x1y = y1;
  }
 
  void move(int dxint dy) {
    x += dxy += dy;
  }
}
  
 
class Rectangle {
  Point p,q;
 
  Rectangle(Point p1Point q1) {
    p = p1q = q1;
  }
 
  void move(int dxint dy) {
    p.move(dx,dy);
    q.move(dx,dy);
  }
}
  
weiter
merke
Point org = new Point(0,0);
Point p1  = new Point(4,2);
 
Rectangle r = new Rectangle(org,p1);
 
...
 
p1.move(2,3);  // --> r hat sich verändert
weiter
merke
Rectangle kopiert nicht die Point Objekte, sondern nur die Referenzen
weiter
Lösung
Klonen, Verdoppeln
Eigene Verdopplungsroutinen oder Methode Object clone() aus der Klasse Object überschreiben.
weiter
merke
eigene copy-Methode
 
class Point {
  ...
  public
  Point copy() {
    return
      new Point(x,y);
  }
  ...
}
 
class Rectangle {
  ...
  Rectangle(Point p1Point q1) {
    p = p1.copy();
    q = q1.copy();
  }
  ...
}
weiter
merke
Klonen für Rectangle
 
class Rectangle {
  ...
  public
  Rectangle copy() {
    return
      new Rectangle(p,q);
  }
  ...
}
weiter
merke
verdoppeln mittels clone() aus der Klasse Object. In diesem Fall muss die Klasse die Schnittstelle Cloneable implementieren. Cloneable ist ein sogenanntes marker interface.
 
class Point
  implements Cloneable {
  ...
}
 
class Rectangle
  implements Cloneable {
  ...
  Rectangle(Point p1Point q1) {
    p = (Point)(p1.clone());
    q = (Point)(q1.clone());
  }
 
  ...
 
  protected
  Object clone() {
    return
      new Rectangle(p,q);
  }
 
  // 2. Variante
 
  protected
  Object clone() {
    Rectangle r = (Rectangle)(super.clone());
    r.p = (Point)(r.p.clone());
    r.q = (Point)(r.q.clone());
    return
      r;
  }
  ...
}
weiter
merke
Vollständiges Kopieren,
deep copy
alle Unterstrukturen werden dupliziert

Letzte Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel