Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 49
    Points : 14
    Points
    14

    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
    9 556
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 556
    Points : 14 417
    Points
    14 417

    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 143
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 1 143
    Points : 1 400
    Points
    1 400

    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
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 377
    Points : 35 146
    Points
    35 146

    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 (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

  5. #5
    Candidat au titre de Membre du Club
    Inscrit en
    mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 49
    Points : 14
    Points
    14

    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
    9 556
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 556
    Points : 14 417
    Points
    14 417

    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 143
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 1 143
    Points : 1 400
    Points
    1 400

    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
    Candidat au titre de Membre du Club
    Inscrit en
    mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 49
    Points : 14
    Points
    14

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •