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 :

super.clone() et conseil


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut super.clone() et conseil
    Toujours en m'instruisant sur le java, je suis arriver dans le chapitre traitant des interfaces, donc innevitablement de Cloneable. Et je me suis demander ce que voulait dire de faire super.clone() a ce que je comprend ca appel sa fonction de clone par default mais je ne suis pas sur.

    Ensuite, bien sur en general il vaut mieux de prendre un clone lorsqu'on demande un objet lors d'un getXxx (afin d'eviter que qqun modifie la classe avec laquelle on travail). Donc je me demandais s'il etait bon egalement de le faire sur un setXxx pour les memes raisons?

    Voila donc le code de deux classes utilisant les deux sujets de discution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    //DummyClass.java
     
    import java.util.Date;
     
    public class DummyClass implements Cloneable
    {
        //fields
        private Date dummyField;
     
        //accessors
        public Date getDummyField()
        {
            return (Date)this.dummyField.clone();
        }
     
        public void setDummyField(Date dummyField)
        {
            this.dummyField = dummyField;
        }
     
        //constructors
        public DummyClass(Date dummyField)
        {
            this.dummyField = dummyField;
        }
     
        public DummyClass()
        {
            this(new Date());
        }
     
        //methods
        public String toString()
        {
            return String.format("%tF", this.dummyField);
        }
     
        public DummyClass clone()
            throws CloneNotSupportedException
        {
            DummyClass cloned = (DummyClass)super.clone();
            cloned.dummyField = (Date)this.dummyField.clone();
            return cloned;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    //LaunchDummy.java
     
    import java.util.Date;
     
    public class LaunchDummy
    {
        public static void main(String[] args)
        {
            Date dateDummy = new Date(40000000);
            DummyClass crashDummy = new DummyClass(dateDummy);
            DummyClass crashDummy2 = new DummyClass();
     
            System.out.println(crashDummy);             //retourne 1970-01-01
            try
            {
                crashDummy2 = crashDummy.clone();
            }
            catch (CloneNotSupportedException e)
            {
                System.out.println("Error! " + e);
            }
            dateDummy.setTime(0);
            System.out.println(crashDummy);             //retourne 1969-12-31
            System.out.println(crashDummy2);            //retourne 1970-01-01
        }
    }

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Par rapport à une classe quelquonque "super" représente la classe "Object" de laquelle héritent les autres classes.
    La classe "Object" défini la méthode "clone" et c'est celle là qui est appelée si elle n'est pas redéfinie dans la classe quelquonque.

  3. #3
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    D'accord mais, si la classe herite d'une autre classe, normalement super n'appellera pas celle-ci?

    C'est a ce niveau la que je ne suis pas trop sur de comprendre.

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Si car si A hérite de B elle hérite de toutes ses méthodes, y compris la méthode "clone".
    Donc si C hérite de B elle hérite de "clone" également.
    A moins que A ou B ou C ne redéfinisse la méthode "clone".

  5. #5
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    en fait, je ne vois pas trop l'intérêt de faire un clone quand on fait 1 set :

    l'intérêt du clone, quand on fait un get (sur un objet, bien entendu, pas sur un type primitif), est de donner l'accès à une copie de cet objet. Pourquoi ? tout simplement pour éviter que toute modification sur l'objet renvoyé n'affecte pas l'objet initial.

    En revanche, lors d'un set, le but est bel et bien de MODIFIER l'objet initial ... dans ce cas, quel serait l'utilité du clone ?

    voilou, ++.

  6. #6
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Eh bien par exemple si tu fais un objet de type patate :
    Patate miam = new Patate();
    et que tu l'envoie dans un objet frite, si tu modifie ton objet 'miam' cela modifira egalement celui dans l'objet frite a cause des pointeurs.

    pour laisser tomber les exemples culinaire (hum hum), dans mon code d'en haut on voit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Date dateDummy = new Date(40000000);
    DummyClass crashDummy = new DummyClass(dateDummy);
    System.out.println(crashDummy);             //retourne 1970-01-01
    dateDummy.setTime(0);
    System.out.println(crashDummy);             //retourne 1969-12-31
    Donc je me demandais si pour des questions de securite ou je sais pas trop quoi il etait bon de faire un clone lors du set.

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

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