Copie d'un tableau d'objets
Je veux faire une copie d'un tableau d'objets à l'aide d'un constructeur.
public class PositionList {
private Position[] data = new Position[0];
public PositionList(PositionList other, boolean deepCopy) {
if (deepCopy){
size=other.getSize();
data=new Position[other.data.length];
for (int i=0;i<data.length;i++){
data[i]=other.data[i];
}
Cependant, ce que j'ai ci-dessus, pour quelque raison n'est pas de travail. J'ai des tests automatisés que je dirige, et sa a défaut de ces tests. Donc, il y a une erreur ici que Im pas sûr de ce qu'il est.
OriginalL'auteur Snowman | 2010-10-16
Vous devez vous connecter pour publier un commentaire.
Ce que vous avez mis en place est un peu profonde copie. Pour mettre en œuvre un profonde de copie, vous devez
changement
à quelque chose qui affecte un copie de
other.data[i]
àdata[i]
. Comment vous faites cela dépend de laPosition
classe. Les alternatives possibles sont:un constructeur de copie:
data[i] = new Position(other.data[i]);
une méthode de fabrique:
data[i] = createPosition(other.data[i]);
clone:
data[i] = (Position) other.data[i].clone();
Notes:
clone
approche ne fonctionnera que siPosition
explicitement le prend en charge, et cela est généralement considéré comme une solution insuffisante. En outre, vous devez être conscient du fait que le natif de mise en œuvre declone
(c'est à dire laObject.clone()
méthode) une copie superficielle.En fait, le problème général de la mise en œuvre profonde de la copie en Java est compliqué. Dans le cas de la
Position
classe, on peut supposer que les attributs sont tous les types primitifs (par exemple, entiers ou en double), et donc une profonde peu profonde contre la copie, est discutable. Mais si il y a des attributs de référence, alors vous devez compter sur le constructeur de copie par défaut /méthode /méthode clone pour faire le genre de la copie que vous avez besoin. Dans chaque cas, il doit être programmé. Et dans le cas général (où vous avez à traiter avec des cycles), il est difficile et exige que chaque classe pour mettre en œuvre des méthodes spéciales.Il y a un autre potentiel moyen de copier un tableau d'objets. Si les objets dans le tableau sont serializable, alors vous pouvez les copier en utilisant
ObjectOutputStream
etObjectInputStream
sérialiser et puis désérialiser le tableau. Cependant:transient
champs ne soient pas copiés.La copie par la sérialisation n'est pas recommandé. Il serait mieux de soutenir le clonage ou d'une autre méthode.
Dans l'ensemble, profond, la copie est préférable d'éviter en Java.
Enfin, pour répondre à votre question au sujet de la
Position
classes constructeur de copie d'œuvres, je m'attends à quelque chose qui ressemble à ceci:@Tortue dit, il n'y a pas quelque chose de magique. Vous mettez en œuvre un constructeur (à la main) qui initialise son état par la copie à partir d'une instance existante.
C'est pas de la magie. Quelqu'un a besoin d'écrire un constructeur pour la Position de classe qui prend une instance de cette classe comme son seul argument et renvoie une copie en profondeur.
Pas nécessairement clone() la copie en profondeur: par exemple, renvoie une copie de cette liste de tableaux, par exemple. (Les éléments eux-mêmes ne sont pas copiés.)
Concernant la troisième option,
clone()
- assurez-vous que le Point met en œuvreCloneable
.Je veux créer une copie d'un Tableau d'Objets, ne les Tableaux.copyOf() créer une copie en profondeur ? Ce sont des objets de quelques classes personnalisées, qui n'a pas mis en œuvre les Clonable interface. stackoverflow.com/questions/18954873/...
OriginalL'auteur Stephen C
Quand vous dites:
Vous êtes juste de la copie d'une liste de références (en supposant que c'est un tableau d'objets). Si vous voulez faire une copie, vous devez utiliser
new
pour créer une nouvelle instance de chaque objet dans le tableau.Oui. Dans chaque itération, créer un
new
objet et l'ajouter àdata
.Ok Im confus. Alors je supprimer
data=new Position[other.data.length];
pour le code j'ai ci-dessus et en quelque sorte l'ajouter dans la boucle?OriginalL'auteur Justin Ethier
Au lieu de dire:
Vous voulez faire d'un constructeur de copie pour
Position
(en d'autres termes, un constructeur pour la Position que prend dans un autrePosition
et des copies de données primitifs (à l'intérieur) et de diredata[i]=new Position(other.data[i]);
En fait votre "copie" constructeur de la
PositionList
est un constructeur de copie, bien que le constructeur de copie ne tendent à indiquer une copie en profondeur, de sorte que ledeepCopy
paramètre n'est pas nécessaire.Nous sommes censés le faire sans le clone...
c'est vrai, j'ai été en supposant que
Position
était un POJO, et donc,.clone()
serait de travailler.Comment puis-je le faire sans clone?
Ensuite, utilisez un constructeur de copie, comme ma solution alternative a dit. Cela dit, j'ai vraiment devrait avoir mis en place le "constructeur de copie" solution d'abord, en raison du fait que
.clone()
a des inconvénients.OriginalL'auteur Thomas
Voici une fonction que j'utilise:
Il ne fonctionne que sur les tableaux avec les objets avec un seul niveau.
OriginalL'auteur Kainan
Cela devrait faire une "profonde" copie
OriginalL'auteur D Patrick