63 votes

En Java, qu'est-ce qu'une copie superficielle?

java.util.Calendrier.clone() retourne "...un nouveau Calendrier avec les mêmes propriétés" et renvoie "une copie de ce Calendrier".

Cela ne semble pas être une copie superficielle comme réponse ici sur DONC. Cette question est étiqueté indépendant de la langue, Java ne semble pas suivre le langage de définition agnostique. Comme je l'étape dans le code j'ai remarqué que la structure et les éléments sont copiés à ce nouvel objet, plus que la langue agnostique seulement la structure de l'.

En Java, ce qui est une copie?

Comment est-il différent de Java copie en profondeur (si cela existe)?

98voto

KitsuneYMG Points 7604

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

21voto

La copie superficielle n'est qu'un ensemble de pointeurs vers les mêmes emplacements de mémoire. En fait, il ne crée pas de copie réelle, ce qui réduit l'utilisation de la mémoire.

Dans le cas d'une copie complète, une copie exacte du segment de mémoire est créée et les pointeurs sont définis sur de nouveaux emplacements de mémoire. Donc, théoriquement, la consommation de mémoire devrait être deux fois dans ce cas.

8voto

mnuzzo Points 1497

Une copie est une copie de la référence pointeur vers l'objet, alors qu'une copie est une copie de l'objet lui-même. En Java, les objets sont conservés dans le fond, ce que vous normalement interagir avec lorsque vous traitez avec les objets est les pointeurs. Les noms de variable point de l'espace de la mémoire de l'objet. Une copie est faite lorsque vous définissez une variable est égale à l'autre comme suit:

Object B = A;

Une copie en profondeur pourrait être fait en obtenant les propriétés de l'objet A et de les mettre dans un nouvel objet B.

Object B = new Object(A.getProperty1(), A.getProperty2()...);

Cela affecte le comportement du programme en ce que si vous faites une copie superficielle et à faire un travail sur elle, qui affecte tous superficiels des copies de l'objet. Si vous apportez une modification à une copie en profondeur, seule la copie est affecté. J'espère que c'est assez détaillé pour vous.

3voto

Les documents 1.6 documentent Calendar.clone comme "Crée et retourne une copie de cet objet." Une copie littérale superficielle spécifiée par Object.clone n'aurait aucun sens. Java utilise le terme "copie superficielle" dans un sens assez typique.

2voto

jsight Points 16025

Il semble que ce soit une erreur dans la documentation. Je ne vois pas en quoi la méthode Calendar.clone d'Android répond à la définition typique (en Java ou autre) d'une "copie superficielle".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X