IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Cloner un Objet : clone() vs copie par constructeur


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Points : 31
    Points
    31
    Par défaut Cloner un Objet : clone() vs copie par constructeur
    Bonjour,

    Je suis en train de lire le livre "Java effective" de Joshua Bloch, et une des recommandations concerne la copie d'objets.

    L'auteur y énonce qu'il est préférable d'utiliser une copie par constructeur, plutôt que d'utiliser la méthode clone() . J'ai relu plusieurs fois ces quelques pages et j'avoue que j'ai encore du mal à comprendre.

    En fait, j'ai compris pourquoi les copies par constructeur étaient de bonnes choses (utilisation des champs finaux, etc), mais je ne comprends pas tellement les défauts de la méthode clone().

    Pour moi, c'est une méthode comme une autre où il est possible d'y effectuer les actions que l'on veut (une copie profonde par exemple), et on peut donc faire la même chose que dans un constructeur. Et à mon avis, c'est là où je rate un point essentiel.

    Si vous pouviez éclairer ma lanterne...

    Lien : http://www.artima.com/intv/bloch13.html

    Merci d'avance !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par Peps0u Voir le message
    Pour moi, c'est une méthode comme une autre où il est possible d'y effectuer les actions que l'on veut (une copie profonde par exemple), et on peut donc faire la même chose que dans un constructeur. Et à mon avis, c'est là où je rate un point essentiel.
    Pourtant il en parle dans ce lien. En résumé :

    - clone() n'apporte rien de plus que le mécanisme de constructeurs, et, non, quelque chose qui fait double emploi n'est pas une bonne chose, c'est une mauvaise chose qui ne fait que compliquer et n'a pas de bon point (car si elle en avait on ne parlerait pas de double emploi.)
    On peut envisager des exceptions sémantiques, comme Math.sqrt() et Math.pow(), alors que la racine carrée n'est qu'une élévation à la puissance un demi, mais c'est parce que c'est plus clair pour les gens qui ne sont pas habitués à ça. clone() n'a pas de ce genre de considérations.

    - clone() est cassé, non-intuitif et plein de pièges. Il encourage les bugs et le code sale. Non pas par son double emploi, mais par sa conception.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    J'ajouterais quand meme que pour le débat cloner par constructeur ou cloner par fonction, il y a une limitation importante au clonage par constructeur : le polymorphisme. En effet, ca impose de connaitre la classe cible, ce qui n'est pas toujours le cas. En ce qui me concerne, je n'utilise pas non plus clone. En général, si j'en ai besoin, j'utilise plutot une méthode getCopy qui renvoie un clone de l'objet (mais bien fait).

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En gros,

    le clonage par constructeur permet de gérer les champs finaux
    le clonage par une méthode spécifique (clone ou autre) permet de gérer le polymorphisme

    Maintenant, tu peux combiner, une méthode clone() qui appelle un constructeur par copie...

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    En fait, je me rappelle être tombé sur un cas de clonage à faire il y a quelque temps.

    En gros, tous les champs de type primitifs devaient avoir leur propre valeurs, mais le fait que les champs de type objet soient partagés ne me dérangeait pas du tout (pour mon cas particulier évidemment).

    Dans ce cas là, la méthode clone() n'est elle pas la plus appropriée ? Car si on ajoute un nouveau champ de type primitif, tout est automatique.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par Peps0u Voir le message
    Dans ce cas là, la méthode clone() n'est elle pas la plus appropriée ? Car si on ajoute un nouveau champ de type primitif, tout est automatique.
    C'est plus rapide, plus facile, plus automatique. Mais c'est fragile. Figé. Impossible à étendre. Susceptible d'introduire des bugs avec le temps.

    Maintenant, c'est moi qui parle là, si on sait que ça va rester simple, ce n'est pas à proprement parler un problème
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Peps0u Voir le message
    Dans ce cas là, la méthode clone() n'est elle pas la plus appropriée ? Car si on ajoute un nouveau champ de type primitif, tout est automatique.
    De toute facon, rien ne t'interdit de l'utiliser. Il faut juste savoir quelles sont les limites et les risques. Apres, ce n'est qu'une question de choix. C'est pour ca que developpeur, c'est un métier

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos réponse, je pense avoir mieux cerner le "problème" (qui n'en était pas vraiment un) !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/05/2006, 15h39
  2. [VBA-E] Copie par valeur d'une feuille dans un nouveau classeur
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/05/2006, 23h38
  3. Manipulation d'objet MS-Access (Copie de table, états, form)
    Par Mustard007 dans le forum Bases de données
    Réponses: 1
    Dernier message: 14/02/2006, 22h37
  4. [WD9] Cloner un objet
    Par Romanops dans le forum WinDev
    Réponses: 12
    Dernier message: 06/02/2006, 16h52
  5. Cloner un objet : comment créer l'instance ?
    Par phplive dans le forum Langage
    Réponses: 8
    Dernier message: 29/05/2005, 19h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo