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

Collection et Stream Java Discussion :

Comment faire de la defensive copie avec un objet de type Collection


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut Comment faire de la defensive copie avec un objet de type Collection
    Bonsoir,

    Ayant un objet de type Collection et voulant en faire une copie pour faire du pattern defensive, je ne sais pas comment faire...

    La méthode clone n'étant pas disponible sur cette classe...


    ex : Collection<Numero> num;

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Par défaut
    Plop,

    Pour ce qui est de la méthode clone(), certaines collections la supportent (ArrayList, ...).

    Si tu utilises des List, tu peux regarder la méthode Collections.copy.

    Enfin, tu peux tout simplement créer une nouvelle Collection, et ajouter tous les éléments de la collection courante, en itérant simplement dessus.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Ok, merci

    J’essaie l'itération!

    Pour ce qui est d'utiliser la méthode clone(), je n'y arrive cependant pas...
    Une méthode me renvoyant un objet "Collection".

    Collection<Maire> newcoll = new ArrayList<Maire>();
    clone n'est pas disponible et j'ai bien implémenté Cloneable et surchargé clone()...

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    L'itération est réussie!

    Pensez-tu cependant qu'il y a une possibilité d'utiliser clone() même si l'objet est de type "Collection"?


    Merci d'avance

  5. #5
    Membre expérimenté
    Profil pro
    Opération
    Inscrit en
    Décembre 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Opération

    Informations forums :
    Inscription : Décembre 2012
    Messages : 91
    Par défaut
    Je ne suis pas sûr que 'clone' soit la bonne voie à suivre.
    Pour moi, il faut que les objets de la collection implémentent une méthode ou un constructeur de copie défini dans une interface commune.

    Dans ce cas la copie peut être réalisée par exemple comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Collection<Copyable> getNewCopy(Collection<Copyable> c) throws Exception{
        Iterator<Copyable> i = c.iterator();
        Collection c2 = c.getClass().newInstance();
        while (i.hasNext()){
          Copyable o = i.next();
          c2.add(new Copyable(o));
        }
    D'autre avis ?

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Voici ce que j'ai fait :


    Collection<Copyable> getNewCopy = ...;
    Collection<Copyable> newcoll = new ArrayList<Copyable>();

    Iterator<Copyable> iter = getNewCopy.iterator();
    while(iter.hasNext())
    newcoll.add((Copyable) iter.next());
    J'essaye votre code après manger

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le plus simple serait d'utiliser Collections.unmodifiableCollection() ou un dérivé...

    a++

  8. #8
    Membre expérimenté
    Profil pro
    Opération
    Inscrit en
    Décembre 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Opération

    Informations forums :
    Inscription : Décembre 2012
    Messages : 91
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Le plus simple serait d'utiliser Collections.unmodifiableCollection()
    !! unmodifiableCollection permet de rendre non-modifiable la collection pas le contenu de la collection.

  9. #9
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jdevbe Voir le message
    !! unmodifiableCollection permet de rendre non-modifiable la collection pas le contenu de la collection.
    Tout à fait !

    J'ai lu trop vite et je n'avais pas compris ce prérequis...


    Dans ce cas oui il faut à la fois dupliquer la collection et tout son contenu :/

    a++

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Rebonsoir!

    Je ne pense pas que unmodifiableCollection me conviendrait, j'ai peut-être oublié de préciser que j'aimerais pouvoir modifier la collection retournée par la méthode sans toucher à celle d'origine.
    C'est cependant une méthode qui a l'air très utile


    Pour ta méthode jdevbe, j'ai cependant une erreur

    Syntax error on token "(", ; expected
    au niveau de la première paranthèse
    et
    Syntax error, insert ";" to complete LocalVariableDeclarationStatement
    au niveau du c

  11. #11
    Membre Expert
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collection<Maire> newcoll = new ArrayList<Maire>();
    Le problème ici est que l'interface Collection n'hérite pas directement de Cloneable. Donc elle n'est prête à être clonée. En revanche la classe ArrayList est bien Cloneable. Tu peux donc faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Collection<Maire> copyFrom(ArrayList<Maire> from) {
      return from.clone();
    }
    Maintenant, le plus simple selon moi est de faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Collection<Maire> copyFrom(ArrayList<Maire> from) {
      return new ArrayList<Maire>(from);
    }
    Enfin, si tu désires faire une copie en profondeur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Collection<Maire> copyFrom(Collection<Maire> from) {
      List<Maire> list = new ArrayList<Maire>(from.size());
      for(Maire maire : from) {
        list.add(maire.clone()); // Si Maire implémente Cloneable.
      }
      return list;
    }

  12. #12
    Membre expérimenté
    Profil pro
    Opération
    Inscrit en
    Décembre 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Opération

    Informations forums :
    Inscription : Décembre 2012
    Messages : 91
    Par défaut
    Voici une version plus complète pour être plus claire:
    interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Copyable {
      Copyable newCopy(Copyable c);
    }
    Objet copyable:
    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
      class ObjCopyable implements Copyable {
        int data;
        ObjCopyable(int i){
          this.data = i;
        }
        ObjCopyable(ObjCopyable c){
          this.data = c.data;
        }
        void setData(int i){
           this.data = i;
        }
        @Override
        public Copyable newCopy(Copyable c) {
          return new ObjCopyable((ObjCopyable)c);
        }
        @Override
        public String toString(){
          return Integer.toString(data);
        }
    Classe de test:
    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
    public class Test{
     
    public static void main(String[] args) throws Exception {
        Collection<Copyable> list = new ArrayList();
        ObjCopyable o = new ObjCopyable(1);
        list.add(o);
        display(list);
        Collection<Copyable> listBackup = getNewCopy(list);
        o.setData(2);
        display(list);
        display(listBackup);
    	}
     
      static  Collection<Copyable> getNewCopy(Collection<Copyable> c) throws Exception{
        Iterator<Copyable> i = c.iterator();
        Collection c2 = c.getClass().newInstance();
        while (i.hasNext()){
          Copyable o = i.next();
          c2.add(o.newCopy(o));
        }
        return c2;
      }
      static  void display(Collection<Copyable> c) throws Exception{
        Iterator<Copyable> i = c.iterator();
        while (i.hasNext()){
          Copyable o = i.next();
          System.out.println(o);
        }
      }
    }

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Ca marche!

    Merci à tous et bonne soirée

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/07/2006, 14h10
  2. Réponses: 3
    Dernier message: 27/07/2006, 10h17
  3. TIBDataSet comment faire de la mise à jour avec jointure
    Par uluru dans le forum Connexion aux bases de données
    Réponses: 8
    Dernier message: 08/07/2006, 11h09
  4. Comment faire un jeu en réseau avec J2ME ?
    Par Yakurena dans le forum Java ME
    Réponses: 1
    Dernier message: 27/03/2006, 20h09
  5. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 18h33

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