Referenzen |
Zugriffspfade auf Objekte
|
| |
|
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 ...
|
| |
|
manchmal beabsichtigt
manchmal Fehler
|
| |
Beispiel |
für fehlerhaftes Verhalten
|
|
class Point {
int x,y;
Point(int x1, int y1) {
x = x1; y = y1;
}
void move(int dx, int dy) {
x += dx; y += dy;
}
}
|
|
class Rectangle {
Point p,q;
Rectangle(Point p1, Point q1) {
p = p1; q = q1;
}
void move(int dx, int dy) {
p.move(dx,dy);
q.move(dx,dy);
}
}
|
| |
|
Point org = new Point(0,0);
Point p1 = new Point(4,2);
Rectangle r = new Rectangle(org,p1);
...
p1.move(2,3);
|
| |
|
Rectangle kopiert
nicht die Point Objekte,
sondern nur die Referenzen
|
| |
Lösung |
Klonen, Verdoppeln
Eigene Verdopplungsroutinen oder
Methode Object clone()
aus der Klasse Object überschreiben.
|
| |
|
eigene copy-Methode
|
|
class Point {
...
public
Point copy() {
return
new Point(x,y);
}
...
}
|
|
class Rectangle {
...
Rectangle(Point p1, Point q1) {
p = p1.copy();
q = q1.copy();
}
...
}
|
| |
|
Klonen für Rectangle
|
|
class Rectangle {
...
public
Rectangle copy() {
return
new Rectangle(p,q);
}
...
}
|
| |
|
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 p1, Point q1) {
p = (Point)(p1.clone());
q = (Point)(q1.clone());
}
...
protected
Object clone() {
return
new Rectangle(p,q);
}
protected
Object clone() {
Rectangle r = (Rectangle)(super.clone());
r.p = (Point)(r.p.clone());
r.q = (Point)(r.q.clone());
return
r;
}
...
}
|
| |
|
Vollständiges Kopieren,
deep copy
alle Unterstrukturen werden dupliziert
|