Une copie simple copie simplement les valeurs des références de la catégorie. Une copie en profondeur copie les valeurs. donnée:
class Foo {
private Bar myBar;
...
public Foo shallowCopy() {
Foo newFoo = new Foo();
newFoo.myBar = myBar;
return newFoo;
}
public Foo deepCopy() {
Foo newFoo = new Foo();
newFoo.myBar = myBar.clone(); //or new Bar(myBar) or myBar.deepCopy or ...
return newFoo;
}
}
Foo myFoo = new Foo();
Foo sFoo = myFoo.shallowCopy();
Foo dFoo = myFoo.deepCopy();
myFoo.myBar == sFoo.myBar => true
myFoo.myBar.equals(sFoo.myBar) => true
myFoo.myBar == dFoo.myBar => **false**
myFoo.myBar.equals(dFoo.myBar) => true
Dans ce cas, la copie a la même référence (==
) et la copie en profondeur, n'a qu'un équivalent de référence (.equals()
).
Si une modification est apportée à la valeur d'un superficiellement copié de référence, puis la copie tient compte de ce changement, car il partage la même référence. Si une modification est apportée à la valeur de profondément copié de référence, puis la copie n'a pas refléter ce changement, car il ne partage pas la même référence.
C-ism
int a = 10; //init
int& b = a; //shallow - copies REFERENCE
int c = a; //deep - copies VALUE
++a;
Résultat:
a is 11
*b is 11
c is 10