1

Salut.

Est-ce que vous pouvez m'aider pour la difficulté suivante :
1) Les données
*** Je dispose d'une classe CombinaisonKakuro (crée par moi-même)
*** Je dérive la classe ArrayList<CombinaisonKakuro> (spécificité pour version >= Java 5 : nom de code Tiger)
---- elle contient néanmoins un memebre supplémentaire de type int[] : listeCardinal
----- seul le constructeur par défaut de ReservoirCombinaisonKakuro est défini : il initialise notamment son membre listeCardinal.

pubic class ReservoirCombinaisonkakuro extends ArrayList<CombinaisonKakuro>
implements Cloneable {
/**....**/
protected int[] listeCardinal;
/**...**/
}


2) Voilà, cette classe je veux la cloner. Mais pour moi cette situation est inédite car et ArrayList<E> et int[] sont clonable et doivent être clonées dans mon cas. Comment puis-je m'y prendre ?
Le gentil timide du 64

2

Quel est ton problème exactement ?

- Clone la partie ArrayList de l'objet, en faisant appel à super.clone()
- Clone le tableau en appelant listeCardinal.clone(), et place le dans le membre listeCadinal de l'objet obtenu précédemment.

Attention, ArrayList fait une "shallow copy" de la liste, si tu veux faire une "deep copy", à toi d'implémenter le clonage de la liste, en recréant une nouvelle liste et en la peuplant avec les clones des CombinaisonKakuro (qui doivent être eux-mêmes clonables) que la liste initiale contient.

3

Voilà, ce qui m'enbêtais c'est que je ne savais pas si les deux éléments muables, à savoir la classe ReservoirCombinaison et le tableau listeCardinal[] allaient être clonés si je fais appel à super.clone(); étant donné que super fait référence à la classe parent , donc ArrayList<Combinaison>.

Donc, si j'ai compris, super.clone permet de cloner toute ma classe ReservoirCombinaison (du moins ses membres muables, c.a.d non déclarés final), mais pas de manière correcte pour listeCardinal ?
Le gentil timide du 64

4

* La Javadoc demande à ce que que la méthode clone() de chaque classe d'une hiérarchie fasse appel à super.clone() pour qu'au finale Object.clone() soit appelé, qui fait seulement une shallow copy (sans parcourir récursivement les objets du graphe).
Après c'est à chaque classe de la hiérarchie d'implémenter le clonage comme il le souhaite, et aux classes filles d'adapter leur clonage en fonction de ce que fait leur parents (puisque super.clone() est appelé).
Ici ta classe parente fait une shallow copy, à toi te voir si ça te convient. Sinon modifie l'objet retourné par super.clone() pour faire une deep copy. Ensuite pour listeCardinal, Object.clone() aura normalement simplement copié la référence dans l'objet cloné, A toi de la cloner toi-même et de l'ajouter à l'objet cloné.

5

merci smile
Personnellement, une "shallow copy" est suffisante : ma classe dérivant directement une ArrayList.
Le gentil timide du 64