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

Langage Java Discussion :

[débutant] Utilité de clone dans Object ?


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut [débutant] Utilité de clone dans Object ?
    Bonsoir à tous,

    Je découvre Java depuis quelques jours et mes lectures ne répondent pas à une question existentielle sur l'utilité de la méthode clone dans Object. Je m'explique :

    - La méthode clone(), si elle est définie dans Object ne peut pas être utilisée sur une objet dont la classe n'implémente pas l'interface Cloneable.
    - Cette interface est vide.
    => pourquoi ne pas déclarer la méthode clone dans Cloneable et la virer de Object puisque bien que cette méthode fasse partie de l'interface de la classe Object, on ne peut pas s'en servir tant que l'interface Cloneable n'est pas implémentée... Peut-être y a-t-il une bonne raison à cela et je suis curieux de la connaître !

    Je suis sans doute un peu trop formaté par mon C# quotidien qui suit le schéma que je décris.

    Merci pour vos éclaircissements.

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Parce que la méthode clone() de la classe Object n'est pas une méthode abstraite mais dispose bel et bien d'une implémentation, la méthode clone() est d'ailleurs native, donc non écrite en Java. Par défaut, la méthode clone() crée une nouvelle instance de l'objet et effectue une copie "physique" des attributs de l'objet.
    Lorsque la méthode clone() est redéfinie dans une sous-classe, la première chose à faire est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
       Object cloned = super.clone();
    } catch (CloneNotSupportedException ex) {
       // ne peut pas arriver si la classe implémente Cloneable
    }
    pour être sûr que les attributs de l'objet sont bien copiés. Ensuite, libre au programmeur de définir un comportement spécifique de la méthode, par exemple pour dupliquer un attribut en profondeur (collection, ...).
    Si la méthode clone() était spécifiée par l'interface Cloneable, il serait impossible de s'appuyer sur l'implémentation par défaut disponible dans la classe Object.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Effectivement, ça paraît être une raison valable, merci pour l'explication.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    De même, cela permet d'implémenter Cloneable tout en laissant la méthode clone() en protected, et donc utilisable seulement par les méthodes d'instances ou les classes filles...

    Plus de détail dans "Penser en Java" : Pourquoi cet étrange design ?

    A noter que de nos jours on utiliserait surement un autre pattern (avec des annotations on pourrait faire quelque chose de bien plus propre).

    Mais de toute manière le cloneage n'est pas vraiment utile en java...

    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par adiGuba
    De même, cela permet d'implémenter Cloneable tout en laissant la méthode clone() en protected, et donc utilisable seulement par les méthodes d'instances ou les classes filles...
    Effectivement, c'est un autre argument. Sur le même sujet, j'en profite pour chercher la confirmation de ce que je lis : je n'ai vu nulle part la possibilité d'implémenter une interface de manière explicite comme le permet C#. J'en déduis que ce n'est pas possible en Java.
    Sans en détailler la syntaxe qui n'a pas d'intérêt ici, l'implémentation explicite permet de masquer les méthodes de l'interface lorsque la référence n'est pas downcastée dans le type de l'interface => ça permet à une classe d'implémenter une interface sans polluer cette dernière et c'est souvent très élégant.

    Merci pour le lien, il explique plutôt bien la relative étrangeté de ce design.

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par adiGuba
    Mais de toute manière le cloneage n'est pas vraiment utile en java...
    Ben justement, j'en ai besoin aujourd'hui même, donc ça arrive ! Vous allez dire que mon pattern est assez bizarre, mais j'ai besoin de clone() pour "synchroniser" 2 beans (1 form bean Struts et un bean User tout simple que je clone). En gros, dans mon form bean Struts, j'ai une methode setUser(User) qui clone le bean User avant de l'affecter à une propriété d'instance. Ensuite, sur chaque méthode setXxx() de mon form bean, j'appelle la méthode équivalente sur mon clone de User. Comme ça, lorsque je fait un getUser() sur mon form bean, je suis sûr (modulo l'ordre d'appel des méthodes setUser() et autres setXxx()) de récupérer un User avec les dernières bonnes infos du formulaire.

    Ca vous paraît crédible ?

  7. #7
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Citation Envoyé par _Mac_
    Ben justement, j'en ai besoin aujourd'hui même, donc ça arrive ! Vous allez dire que mon pattern est assez bizarre, mais j'ai besoin de clone() pour "synchroniser" 2 beans (1 form bean Struts et un bean User tout simple que je clone). En gros, dans mon form bean Struts, j'ai une methode setUser(User) qui clone le bean User avant de l'affecter à une propriété d'instance. Ensuite, sur chaque méthode setXxx() de mon form bean, j'appelle la méthode équivalente sur mon clone de User. Comme ça, lorsque je fait un getUser() sur mon form bean, je suis sûr (modulo l'ordre d'appel des méthodes setUser() et autres setXxx()) de récupérer un User avec les dernières bonnes infos du formulaire.

    Ca vous paraît crédible ?
    J'ai rien compris Pourquoi fais tu un clone et pourquoi n'utilises tu pas directement l'instance originale de ton bean user ?
    [mode evangelist]Passe à spring tes forms pourront être des pojo et donc tu pourra utiliser tes pojo dans ta couche web[/mode evangelist] <-- je vais encore me faire des ennemis j'adore ca.

  8. #8
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par zekey
    [mode evangelist]Passe à spring tes forms pourront être des pojo et donc tu pourra utiliser tes pojo dans ta couche web[/mode evangelist] <-- je vais encore me faire des ennemis j'adore ca.
    Ouais, ben on choisit pas toujours sa technologie !!

    Pourquoi je fais un clone ? C'est simplement parce que mon bean User initial peut être référencé ailleurs dans une sorte de cache (le bean est issue d'une recherche donc j'ai optimisé) et je ne veux pas que les modifs non "commitées" apparaissent quand on réaffiche la recherche.

  9. #9
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Citation Envoyé par _Mac_
    Ouais, ben on choisit pas toujours sa technologie !!

    Pourquoi je fais un clone ? C'est simplement parce que mon bean User initial peut être référencé ailleurs dans une sorte de cache (le bean est issue d'une recherche donc j'ai optimisé) et je ne veux pas que les modifs non "commitées" apparaissent quand on réaffiche la recherche.
    Naturellement je plaisantais, je sais bien que l'on ne fait pas toujours ce que l'on veut. Cependant cette idée de cache me dérange un peu mais bon je ne connais pas votre architecture et vos use cases. Il faut avoir de gros problèmes de performances pour mettre en place un cache de ce type, c'est une mine de bugs potentiels et de problèmes de synchronisation(pas au sens java). Pas en fait ce que tu fais c'est une sorte de système de versioning de beans....

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dabeuliou
    Sans en détailler la syntaxe qui n'a pas d'intérêt ici, l'implémentation explicite permet de masquer les méthodes de l'interface lorsque la référence n'est pas downcastée dans le type de l'interface => ça permet à une classe d'implémenter une interface sans polluer cette dernière et c'est souvent très élégant.
    Tiens je ne savais pas que c'était possible en .NET ! C'est un concept intéressant mais cela n'existe pas en Java...

    En général on utilise une classe interne ou une classe anonyme pour cela...

    a++

  11. #11
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par zekey
    Il faut avoir de gros problèmes de performances pour mettre en place un cache de ce type, c'est une mine de bugs potentiels et de problèmes de synchronisation(pas au sens java). Pas en fait ce que tu fais c'est une sorte de système de versioning de beans....
    Perf, oui : faut que je croise des infos entre un annuaire LDAP et une base de données en récupérant un max d'info des 2. Je suis assez partisan de l'optimisation alors ce que j'ai récupéré une fois, j'essaie de ne pas aller le récupérer une seconde fois.

    Sinon, j'ai fait plus "simple" sans clone, ce qui revient au même fonctionnellement et en plus allège la mémoire.

Discussions similaires

  1. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00
  2. [débutant] nombre de colonne dan sun fichier csv
    Par mandagor dans le forum C++
    Réponses: 18
    Dernier message: 15/06/2005, 15h42
  3. [VB.NET] [Débutant] Probléme de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/03/2005, 13h13
  4. [Débutant - Avis] même variable dans plusieurs pages...
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 16/12/2004, 22h50
  5. [Débutant] Triage de données dans un String
    Par Poilou dans le forum C++Builder
    Réponses: 4
    Dernier message: 29/01/2004, 16h21

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