Java et le clonage

Résolu/Fermé
Tom1712 Messages postés 102 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 11 juin 2011 - 6 juin 2011 à 20:58
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 6 juin 2011 à 22:54
Bonjour,

j'ai une petite question sur le clonage. J'ai bien compris comment il fonctionne en java mais je me demande pourquoi se compliquer la vie ainsi. Imaginons la classe suivante

public class Fraction {

int p;
int q;

public Fraction(int p,int q){
this.p=p;
this.q=q;
}

public Object clone(){
Fraction bis=new Fraction(p,q);
return bis;
}

}

Pourquoi ne peut-on pas faire ça? (en oubliant le fait qu'il faut que la classe implémente Coneable etc, je veux juste comprendre pourquoi mon code précédent n'est pas un clonage valide, d'ailleur rien ne m'interdit de mettre implement Cloneable). J'ai bien un nouvel objet Fraction. Je ne vois pas où est le problème. Si p,q n'était pas des entiers mais également des classes, je peux imaginer qu'il code le clone comme cette classe et mettre leur clone dans mon construction sans problème. Pourquoi, ne peut on pas géré le clonage ainsi?

merci d'avance.




A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 juin 2011 à 21:07
Ton code n'est pas correct car tu dois implémenter l'interface Cloneable, sinon utiliser clone sur un objet Fraction te renverra une CloneNotSupportedException.

Mais si tu rajoutes le implements Cloneable ton code devrait être correct, même si il serait quand même utile de redéfinir equals pour être cohérent...
0
Tom1712 Messages postés 102 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 11 juin 2011 7
6 juin 2011 à 21:10
en fait mon prof a dit que implémenter clone ainsi (même si on mettait Cloneable, géré l'exception etc) n'est pas souhaitable du tout (mettre new)... mais je me souviens plus du tout pourquoi... Je ne vois pas où est le problème.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 juin 2011 à 21:14
Parce que refaire un new t'oblige à recalculer toutes les valeurs.

Par exemple si tu veux faire en sorte que ta fraction soit irréductible, tu vas faire un calcul de pgcd pour déterminer p et q, or en le clonant tu n'as pas besoin de refaire le calcul, mais ici tu n'as qu'un seul constructeur, donc t'es obligé de t'en servir...
0
Tom1712 Messages postés 102 Date d'inscription jeudi 14 août 2008 Statut Membre Dernière intervention 11 juin 2011 7
6 juin 2011 à 22:44
j'ai compris le problème, c'est un problème d'héritage. Si je crée une classe qui hérite de fraction, je ne saurais pas utiliser le fonction clone() crée dans fraction. Donc c'est un problème d'héritage. On devrait redéfinir entièrement la méthode clone sans utilisé celle déjà crée. c'est donc "moins" orienté objet.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 juin 2011 à 22:54
Personnellement, je préfère utiliser un constructeur par copie :

class E
{
   E(E e) {...}
}

E copie = new E(original);

Mais effectivement si on avait E extends D avec D implements Cloneable il faudrait redéfinir clone.
En pratique ça ne m'est jamais arrivé ^^
0