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 :

Quel est l'interet de ca ! CLONE()


Sujet :

Langage Java

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 497
    Points : 312
    Points
    312
    Par défaut Quel est l'interet de ca ! CLONE()
    Bonjour,

    j'aimerais savoçir quel est l interet d'implémenter Cloneable.

    par exemple quelle est la difference entre :

    Méthode 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static void main(String[] args) {
     
    		Rectangle a; // création d'une référence
    		a = new Rectangle(10, 12); // instanciation de la classe Rect.
    		Rectangle b = null;
    		try {
    			b = (Rectangle) a.clone();
     
    		} catch (CloneNotSupportedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    }// a et b ne contiennent pas la même réf. et pointent sur des objets différents
    Méthode 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static void main(String[] args) {
     
    		Rectangle a= new Rectangle(10, 12); 
                    Rectangle a= new Rectangle(10, 12); 		
    }
    Le premier cas, on utilise la méthode clone pour créer une copie de b, c'est a dire un objet indépendant et identique de l'objet 'a'.

    et la deuxieme, on passe cette fois pour créer notre objet b, par le contructeur de la classe rectangle.

    Bon, au niveau de la mémoire c'est deux objets existent quelques soit la méthode 1 ou 2.

    Alors j'aimerais comprendre quelle est l'interet d'avoir une méthode clone, vu qu'au niveau ressource mémo c'est idem ... ca sert à quoi ?

  2. #2
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 247
    Points : 293
    Points
    293
    Par défaut
    Je reprend ton exemple :

    Imagine maintenant que dans pour ton rectangle, dans une partie de ton code, tu modifies la largeur, puis encore plus loin la longueur en fonction de paramètres extérieurs.
    Comment peux-tu récupérer une copie de ton rectangle sans utilisé clone ?
    Vu que tu ne vas pas pouvoir le construire étant donné que tu ne connais plu la longueur et la largeur?

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 497
    Points : 312
    Points
    312
    Par défaut
    ah ouais !

    supposons que 'a' est un objet de "test et de truc", 'b' est l'objet cloné de 'a', afin de faire d'autre traitement spécifique et 'c' un autre objet qui qui est cloné de 'a' afin de faire d'aaaaaautre traitement spécifique ...

    et bien, je fais des clones.

    ok ok.
    merci.

  4. #4
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Points : 380
    Points
    380
    Par défaut
    j'aimerais savoçir quel est l interet d'implémenter Cloneable.
    à faire la guerre des clones ?

    C'est aussi efficace qu'un contructeur par recopie (profonde ou pas, après c'est ta méthode clone() qui le dira)

    Avec des tonnes d'opérations, ça permet de faire des résultats intermédiaires ou même des divergences pour comparer tes différents algos. (précision, efficacité, vitesse ... que sais-je, des performances quoi ^^)

  5. #5
    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,


    En effet, un clone consiste à fait une copie identique.
    Un constructeur permet de créer un objet. Bien sûr si on connait tous les détails de l'objet on peut en créer une copie identique, mais ce n'est pas forcément le cas en particulier lorsqu'on manipule des classes filles (sans forcément le savoir).

    Une erreur courante étant d'implémenter clone() de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MyClass implements Cloneable {
     
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		return new MyClass();
    	}
     
    }
    Le cloneage ne fonctionnera plus dans les classes filles !




    Enfin petits rappels :
    • La CloneNotSupportedException n'est remonté que si la classe n'implémente pas Cloneable. On peut ainsi "ignorer" cette exception (c'est à dire remonter une RuntimeException à la place).
    • Ne pas oublier qu'on peut changer la visibilité de la méthode clone() et la passé de protected à public
    • Penser également qu'on a tout à faut le droit de "supprimer" une exception de la signature d'une méthode, ce qui peut simplifier la vie lorsqu'on sait qu'elle ne sera jamais remontée.
    • Avec Java 5.0 et la covariance du type de retour on peut spécialiser le type de retour d'une méthode, et se débarrasser du cast.

    Plus d'info : Quelles sont les règles à respecter pour redéfinir/implémenter une méthode ?


    Ce qui peut donner comme implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MyClass implements Cloneable {
     
    	@Override
    	public MyClass clone() {
    		try {
    			return (MyClass) super.clone();
    		} catch (CloneNotSupportedException e) {
    			// Ceci ne devrait jamais arriver :
    			throw new RuntimeException("Clone fail", e);
    		}
    	}
     
    }

    a++

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,
    Je rajouterai juste qu'il peut parfois être judicieux de préférer des constructeurs de clônage (manière de clôner sans utiliser Cloneable):

    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
     
    class MyClass {
        MyClass() {}
     
        // Constructeur de clônage
        MyClass(MyClass toClone) {
            this();
            // TODO : copier les champs de toClone dans this
        }
    }
     
    // Classe fille
    class MyClass2 extends MyClass {
        MyClass2(MyClass2 toClone) {
            super(toClone);
            // ...
        }
    }
    Perso, je n'ai jamais aimé Cloneable (en tout cas à l'époque où le cast était obligatoire).

    Je préfère cette méthode
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  7. #7
    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 Pill_S Voir le message
    Je rajouterai juste qu'il peut parfois être judicieux de préférer des constructeurs de clônage (manière de clôner sans utiliser Cloneable):
    Juste une remarque : on parle plutôt de constructeur de copie et ce n'est pas réellement une cloneage puisque le type n'est pas forcément le même.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyClass c1 = new MyClass2();
    MyClass c2 = new MyClass(c1);
    Mais cela n'enlève rien au fait que cela puisse être utile...

    a++

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

Discussions similaires

  1. [Doctrine] Quel est l'interet ?
    Par kaymak dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/01/2010, 13h19
  2. Quel est l'interet du HTMLHelper ?
    Par kendras dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 10/07/2009, 10h23
  3. dreamweaver quel est l'interet?
    Par @min@ dans le forum Dreamweaver
    Réponses: 7
    Dernier message: 17/03/2007, 18h04
  4. Quel est l'intéret d'un ETL Open Source
    Par clairette dans le forum Alimentation
    Réponses: 9
    Dernier message: 27/10/2006, 15h12
  5. [ASE]quel est l'interet des indexes ds cet ex
    Par Mehdi3 dans le forum Sybase
    Réponses: 4
    Dernier message: 18/04/2006, 11h16

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