p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Futur Membre du Club
    Inscrit en
    mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 49
    Points : 16
    Points
    16

    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

    Inscrit en
    septembre 2004
    Messages
    10 369
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 369
    Points : 17 292
    Points
    17 292

    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.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  3. #3
    Membre Expert
    Inscrit en
    mai 2006
    Messages
    1 211
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 1 211
    Points : 1 696
    Points
    1 696

    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 Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 22 818
    Points : 43 317
    Points
    43 317

    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...
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

  5. #5
    Futur Membre du Club
    Inscrit en
    mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 49
    Points : 16
    Points
    16

    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

    Inscrit en
    septembre 2004
    Messages
    10 369
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 369
    Points : 17 292
    Points
    17 292

    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
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  7. #7
    Membre Expert
    Inscrit en
    mai 2006
    Messages
    1 211
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 1 211
    Points : 1 696
    Points
    1 696

    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
    Futur Membre du Club
    Inscrit en
    mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 49
    Points : 16
    Points
    16

    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, 14h39
  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, 22h38
  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, 21h37
  4. [WD9] Cloner un objet
    Par Romanops dans le forum WinDev
    Réponses: 12
    Dernier message: 06/02/2006, 15h52
  5. Cloner un objet : comment créer l'instance ?
    Par phplive dans le forum Langage
    Réponses: 8
    Dernier message: 29/05/2005, 18h27

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