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

avec Java Discussion :

Cloner une classe en Java


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Cloner une classe en Java
    Bonsoir,

    J'essai de cloner une classe en Java mais je rencontre des difficultés. J'ai vu qu'il fallait implémenter Cloneable mais je dois mal m'y prendre.

    Voici un résumé de mon problème :

    -Une Carton compte un nombre pseudo-aléatoire et un ensemble de méthode associés

    -Une liste compte une série de 6 cartons à travers un arrayList et un ensemble de méthode

    -On donne à chaque joueur la même liste contenant les même 6 cartons. Chaque joueur manipulera ensuite ces 6 cartons de manière indépendante

    -Les joueurs sont créés dans la classe Partie.

    Voici les passages clés du code source, je n'ai pas mis toutes les méthodes, getters et setters, si vous voulez quelque chose je vous le donnerai :

    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
     
    public class Carton implements Cloneable {
    	private int valeur;
     
     
    	public Carton() {
     
    		this.valeur = 0;
    	}
    	public Object clone() {
     
    	    Carton carton= new Carton();
     
    	    try {
     
    	      	carton = (Carton) super.clone();
    	    } catch(CloneNotSupportedException cnse) {
     
    	      	cnse.printStackTrace(System.err);
    	    }
     
     
    	    return carton;
    	}
    }
    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
     
    public class Liste implements Cloneable {
     
    private ArrayList<Carton> liste;
     
    public Liste() {
     
    		liste = new ArrayList<Carton>();
    		int[] choix = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 25, 50, 75, 100};
    		int aleatoire;
    		int nbChoix = choix.length;
     
    		for(int i=0; i<6; i++) {
     
    			this.liste.add(new Carton());
    			aleatoire =	new Random().nextInt(nbChoix);
    			this.liste.get(i).setValeur(choix[aleatoire]);
    			choix[aleatoire] = choix[nbChoix-1];
    			nbChoix --;
     
    		}
    	}
    	public Object clone() {
     
    	    Liste liste = null;
     
    	    try {
     
    	      	liste = (Liste) super.clone();
    	    } catch(CloneNotSupportedException cnse) {
     
    	      	cnse.printStackTrace(System.err);
    	    }
     
    		for(int i=0; i<6; i++) {
     
    			liste.liste.add((Carton)this.liste.get(i).clone());
     
    		}
     
    	    return liste;
    	}
    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
     
    public class Joueur {
     
    	private String pseudo;
    	private int score;
    	private Liste liste;
    	private int compteurCoups;
     
    	public Joueur() {
     
    		this.score = 0;
    		this.liste = new Liste();
    		this.pseudo = "Anonyme";
    		this.compteurCoups = 0;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public Partie(int nbJoueurs) {
     
    		Liste li = new Liste();
    		re = new Resultat();
     
    		listeJoueurs = new ArrayList<Joueur>();
    		for(int i=0; i<nbJoueurs; i++) {
    			listeJoueurs.add(new Joueur());
    			listeJoueurs.get(i).setListe((Liste)li.clone());
    		}
     
    	}
    Lorsque j'execute, j'ai un seul object liste commun aux différents joueurs. Les modifications apportées par l'un des joueurs modifient donc aussi l'objet pour les autres joueurs.
    De plus j'ai ma liste qui contient maintenant 6*n éléments pour n joueurs, soit la liste initiale de 6 joueurs décuplée n fois.

    Merci de votre aide.

  2. #2
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Une idée...
    Bonsoir.

    Ne serait-il pas plus simple de travailler avec un Vector ?
    Cet objet est très pratique, cloneable, et peut être utilisé comme une liste.
    Il dispose de methode d'ajout, de suppression, ne nécéssite pas d'être pré-dimensionné, bref, ça me semble être l'idéal dans votre cas...

    Sinon, dans votre constructeur Partie(int NbJoueurs)..., faites simplement

    for(int i=0; i<nbJoueurs; i++) {
    listeJoueurs.add(new Joueur());
    listeJoueurs.get(i).setListe(new Liste());
    }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je débute en Java et je ne connaissais pas l'objet Vector, je vais m'en pencher la dessus mais à priori les méthodes dont il dispose sont identiques à l'objet ArrayList.

    http://java.sun.com/j2se/1.4.2/docs/...ArrayList.html
    http://java.sun.com/j2se/1.4.2/docs/...il/Vector.html

    Je dis bien à priori car je n'ai pas encore regardé en détail, je le ferai demain.

    Je viens de voir que mon ArrayList est également Cloneable. Est-ce que cela signifie que le passage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		for(int i=0; i<6; i++) {
     
    			liste.liste.add((Carton)this.liste.get(i).clone());
     
    		}
    est superflu ? Et dans ce cas dois-je le remplacer par autre chose ?

    Concernant la deuxième solution que vous me proposez, soit

    for(int i=0; i<nbJoueurs; i++) {
    listeJoueurs.add(new Joueur());
    listeJoueurs.get(i).setListe(new Liste());
    }
    Le probléme est que mon objet Liste contient une série de 6 variables définit de manière aléatoire durant l'instanciation. Mais j'aimerai que la valeur de ces variables aléatoire soit identique pour tous mes joueurs.
    Or avec cette solution, un nouvel objet est instancié pour chaque joueur. La série de 6 variables sera donc également différente pour chacun d'entre eux.

    En tout cas merci votre aide.

  4. #4
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut D'accord...
    Dans ce cas ajoutez une méthode du genre createListe() dans votre classe. Instanciez cette dernière une seule fois, puis envoyez dans votre méthode setListe le résultat de createListe() qui se contentera de renvoyer (ArrayList)this.clone();
    Quoi qu'il en soit, puisque ArrayList implémente déja cloneable, vous devriez commencer par retirer de votre code tout ce qui concerne le clonage...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Mon problème semble résolu. Vous avez raison. Comme mon ArrayList est cloneable, j'ai modifié la méthode clone de ma classe liste.

    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 Object clone() {
     
    	    Liste liste = null;
     
    	    try {
     
    	      	liste = (Liste) super.clone();
    	    } catch(CloneNotSupportedException cnse) {
     
    	      	cnse.printStackTrace(System.err);
    	    }
    	    liste.liste = (ArrayList<Carton>)this.liste.clone(); 
    	    return liste;
    	}
    J'ai juste un warning à la ligne liste.liste = (ArrayList<Carton>)this.liste.clone();

    Cette solution est à peu près équivalente à la votre, si ce n'est que la mienne m'oblige à cloner entièrement la classe objet...

    Merci encore une fois.

  6. #6
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Pas de quoi.
    Je suis ravis de vous avoir été utile. Bonne continuation.

Discussions similaires

  1. [C#] Utiliser une classe de JAVA dans C#
    Par Mickael23 dans le forum C#
    Réponses: 4
    Dernier message: 22/05/2009, 19h44
  2. Cloner une classe anonyme
    Par sebge2 dans le forum Langage
    Réponses: 8
    Dernier message: 27/11/2008, 18h36
  3. Probleme avec la recherche directe de methodes sur une Class (API java.lang.reflect)
    Par CyberChouan dans le forum API standards et tierces
    Réponses: 14
    Dernier message: 25/01/2007, 17h12
  4. [Reflection]parser une classe de java.
    Par burkan21 dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 02/12/2005, 21h05
  5. [PL/SQL]Appel d'une classe/méthode java
    Par marsup54 dans le forum SQL
    Réponses: 4
    Dernier message: 30/06/2004, 16h44

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