Partage
  • Partager sur Facebook
  • Partager sur Twitter

J'en demande trop au constructeur?

    24 mai 2011 à 23:04:49

    Salut à tous,

    voilà, je voudrauis faire ça:
    Client(String nom, Voiture v){
    			this.nom = nom;
    			this.numero = cpt;
    			cpt++;
    			this.mesVoitures = new ArrayList <Voiture>();
    			this.mesVoitures.add(v);
    			if (lesClients.contains(this)) System.out.println ("Vous êtes déjà enregistré");
    			else lesClients.add(this);
    	}
    



    Dans le main un client arrive toujours avec un voiture.

    Et donc si mon client existe déjà, afficher le message comme quoi je le connais déjà, ne pas le mettre dans le tableau "lesClients" mais tout de même lui rajouter une voiture dans son tableau "mesVoitures".

    Or, je vois bien que les voitures ne se rajoutent pas.

    Je voulais savoir s'il y a une bonne façon de faire, ou si ce n'est tout simplement pas possible....

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2011 à 0:36:33

      Ton code n'est pas complet, mais de ce que j'en comprends, c'est une classe Client. Ta fonction main crée un nouveau client avec une voiture, et comme ta liste mesVoitures est crée dans ta classe Client, à chaque client tu recrée une liste nouvelle.
      • Partager sur Facebook
      • Partager sur Twitter
        25 mai 2011 à 1:05:33

        Tu as tout compris! Je n avais pas copié le reste du code pour ne pas alourdir.

        Mais en effet, j ai remarqué le problème de la nouvelle ArrayList créée à chaque fois.

        Du coup, j'ai essayé de la mettre dans un if elle aussi mais me retrouvais tout de même avec des erreurs.

        D'oû mes doutes: est-il possible de , un coup créer un nouveau client et lui filer une première voiture et la.fois d'après d'identifier ce même client dans le constructeur sans l'enregistrer mais en lui filant une 2e voiture?

        Une dernière question, suis-je compréhensible? :-/
        • Partager sur Facebook
        • Partager sur Twitter
          25 mai 2011 à 9:23:11

          Salut.
          Pour faire ce genre de chose il faut faire ceci :
          /** declaration de ta liste en static (1 seule et même instance pour tous tes objets) 
           *  Préferer List comme type statique pour permettre une éventuelle évolution  
           */
          static List<Voiture> mesVoitures,
          
          static {
              // initialisation de ta liste lors du chargement de la classe (on recrée pas la liste chaque fois
              mesVoitures = new LinkedList<Voiture>();
          }
          


          et dans ton constructeur deviens :


          Client(String nom, Voiture v){
          	this.nom = nom;
          	this.numero = cpt;
          	cpt++;
          	this.mesVoitures = new ArrayList <Voiture>();
                  // pas de this vu que l'attribut est de classe est non d'instance...
          	mesVoitures.add(v);
          	if (lesClients.contains(this)) System.out.println ("Vous êtes déjà enregistré");
          	else lesClients.add(this);
          	}
          
          • Partager sur Facebook
          • Partager sur Twitter
            25 mai 2011 à 13:40:36

            Je doute de la solution static ...
            Ca veut dire qu'en créant un 2eme client, il va se retrouver avec les voitures du premier.

            Moi ce que je comprend pas c'est :

            Citation : Demiz

            Et donc si mon client existe déjà, afficher le message comme quoi je le connais déjà, ne pas le mettre dans le tableau "lesClients" mais tout de même lui rajouter une voiture dans son tableau "mesVoitures".


            Si ton client existe déjà, tu n'as pas besoin d'appeler le constructeur, tu récupère simplement son instance, et tu lui rajoutes une voiture.

            A moins que j'ai mal compris ce que tu voulais faire.
            • Partager sur Facebook
            • Partager sur Twitter
              25 mai 2011 à 13:43:11

              J'avais mal saisis son soucis en fait :/
              J'avais compris qu'il voulait conserver la liste de toutes les voitures, donc ma solution n'est pas correcte ^^.
              • Partager sur Facebook
              • Partager sur Twitter
                25 mai 2011 à 13:52:41

                Personellement, je suggérerai de mettre dans le constructeur d'un client non pas un objet voiture, mais un objet ArrayList<Voiture>. Il sera toujours possible d'y accéder ensuite pour y ajouter et y enlever des objets.
                • Partager sur Facebook
                • Partager sur Twitter
                  25 mai 2011 à 14:02:39

                  Rien de tout ça.

                  Pour moi il y a un problème de conception dès le départ : dans ce cas, une classe qui contient une liste statique d'elle-même n'a aucun sens (ici visiblement Client contient une liste de Client).

                  La solution est quelque chose du genre (en pseudo-code) :
                  Créer le client
                  Chercher le client dans la liste de clients (qui n'est PAS dans la classe Client).
                  Si le client n'existe pas, le rajouter.
                  Si le client existe, lui ajouter la voiture.

                  Même comme ça l'algo me paraît bizarre, je soupçonne encore un problème de conception plus haut.

                  Note qu'en Java, pour faire ça, il va falloir surcharger les méthodes hashCode() et equals() de Client, ou alors faire la recherche dans la liste "à la main".
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 mai 2011 à 21:17:25

                    J'ai trouvé ma solution:

                    la voici:

                    Client(String nom, Voiture v){
                    			this.nom = nom;
                    			this.numero = cpt;
                    			cpt++;
                    			int i=lesClients.indexOf(this);
                    			if (i>-1){
                    				System.out.println("Vous êtes déjà connu");
                    				Client cli = lesClients.get(i);
                    				cli.mesVoitures.add(v);
                    				}
                    			else {
                    				lesClients.add(this);
                    				this.mesVoitures = new ArrayList<Voiture>();
                    				this.mesVoitures.add(v);
                    			}
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 mai 2011 à 21:25:48

                      Qu'est-ce que ça fait dans la classe Client ?
                      Est-ce que tu peux nous donner ton architecture de classes ? (la liste des classes et de leurs méthodes publiques) ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 mai 2011 à 21:37:55

                        Voici ma classe Client:

                        package voitureclient;
                        import java.util.ArrayList;
                        
                        
                        
                        public class Client {
                        	private int numero;
                        	private String nom;
                        	private static int cpt=1;
                        	private  ArrayList <Voiture> mesVoitures ;
                        	private static ArrayList <Client>lesClients=new ArrayList<Client>();
                        
                        	
                        
                        Client(String nom, Voiture v){
                        			this.nom = nom;
                        			this.numero = cpt;
                        			cpt++;
                        			int i=lesClients.indexOf(this);
                        			if (i>-1){
                        				System.out.println("Vous êtes déjà connu");
                        				Client cli = lesClients.get(i);
                        				cli.mesVoitures.add(v);
                        				}
                        			else {
                        				lesClients.add(this);
                        				this.mesVoitures = new ArrayList<Voiture>();
                        				this.mesVoitures.add(v);
                        			}
                        	}
                        
                        
                        
                        
                        public String toString() {
                        		return "Client n°" + numero + "\nnom : " + nom + " voiture : "
                        				+ mesVoitures + ".";
                        	}
                        
                        
                        
                        public String getNom() {
                        	return nom;
                        }
                        
                        
                        
                        
                        public boolean equals (Object o){
                        	Client c=(Client) o;
                        return (this.nom.equals(c.nom));
                        }
                        
                        
                        
                        public static Client rech(String nom){
                        	for (Client c : lesClients)
                        	{
                        		if(c.getNom().equals(nom))
                        			{return c;}		
                        	}
                        	return null;
                        }
                        


                        Et voici ma classe Voiture
                        package voitureclient;
                        
                        
                        import java.util.GregorianCalendar;
                        import java.util.ArrayList;
                        
                        public class Voiture {
                        	private String immat;
                        	private GregorianCalendar dateimmat;
                        	private  ArrayList <Reparation> Repafaire ;
                        	private static ArrayList <Voiture> lesVoitures = new ArrayList <Voiture>();
                        	
                        	
                        	Voiture(String immat,GregorianCalendar dateimmat) {
                        		
                        		this.immat = immat;
                        		this.dateimmat = dateimmat;
                        		int i = lesVoitures.indexOf(this);
                        		if (i>-1){
                        			System.out.println("Votre voiture est déjà enregistrée");
                        			}
                        		else lesVoitures.add(this);}
                        
                        
                        	Voiture(String immat) {
                        		this (immat,null);
                        	}
                        
                        	
                        public void push(Reparation r){
                        	this.Repafaire=new ArrayList<Reparation>();
                        	Repafaire.add(r);
                        }
                        
                        public static Voiture rech(String immat){
                        	for(Voiture v : lesVoitures)
                        	{if (v.getImmat().equals(immat))
                        		return v;
                        	}
                        	return null;
                        }
                        
                        
                        
                        	public String getImmat() {
                        	return immat;
                        }
                        
                        
                        	public  String toString (){
                        		return (this.immat);
                        	}
                        }
                        


                        et mon main:

                        package voitureclient;
                        
                        import java.util.Scanner;
                        import java.util.GregorianCalendar;
                        import java.util.ArrayList;
                        import java.util.TimeZone;
                        
                        public class Main {
                        	
                        
                        
                        	public static void main(String[] args) {		
                        Scanner clavier = new Scanner (System.in);
                        
                        		int choix;
                        		
                        		
                        		
                        		
                        		System.out.println("Entrez les noms de vos 3 mecanos ainsi que la competence qui lui correspond");
                        		Mecano.init();		
                        				
                        		do {System.out.println("1) un client apporte une voiture");
                        		System.out.println("2) Lister les voitures d'un client");
                        		System.out.println ("3) Prendre en charge une voiture");
                        		System.out.println("0) Fin du programme");
                        		
                        choix=clavier.nextInt();
                        
                        		
                        		switch(choix)
                        		{
                        		case 1: 
                        			System.out.println("Bonjour, veuillez entrer votre nom");
                        			String nom=clavier.next();
                        			System.out.println("veuillez entrer le n°d'immatriculation de la voiture");
                        			String immat=clavier.next();
                        			System.out.println("Veuillez entrer l'année d'immatriculation de la voiture");
                        			int j = 24;int m = 01; int a = clavier.nextInt();
                        			GregorianCalendar date = new GregorianCalendar(j,m,a);
                        			Voiture v = new Voiture(immat,date);
                        			Client c = new Client(nom,v);
                        						
                        			break;
                        				
                        		case 2:
                        			System.out.println ("Entrez votre nom");
                        			String nomc=clavier.next();
                        			Client cli = Client.rech(nomc);
                        			System.out.println(cli);
                        						
                        			break;
                        			
                        		case 3:
                        			System.out.println ("Entrez l'immatriculation de la voiture à réparer");
                        			String immatr = clavier.next();
                        			Voiture vtr = Voiture.rech(immatr);
                        			System.out.println ("Précisez la nature de la réparation");
                        			String repnom = clavier.next();
                        			Mecano mec = Mecano.rechcomp(repnom);
                        			System.out.println(mec);
                        			
                        			
                        			break;
                        		}}
                        while (choix!=0);
                        
                        }
                        }
                        


                        Bon j'ai bien conscience que c'est encore loin d'être parfait mais puisque tu as demandé...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 mai 2011 à 22:25:50

                          C'est bien ce qu'il me semblait : tu ne sembles pas avoir bien compris le concept de modèle objet.

                          Pour commencer, un tuto Java qui permet de bien comprendre le modèle Objet : http://java.developpez.com/livres/javaEnfants/

                          Sinon, et en vrac :

                          Comme déjà dit, une classe n'a aucune raison de contenir une liste d'elle-même.
                          Ce que tu as écrit ici signifie "Un client, quel qu'il soit, est caractérisé par une liste de clients" et "Une voiture, quel qu'elle soit, est caractérisé par une liste de voitures".
                          Ca n'a aucun sens.
                          Exemple d'utilisation des statiques : la classe Integer. Un entier, quel qu'il soit, est caractérisé par une valeur minimale, une valeur maximale, une taille et un type.

                          Par conséquent la liste de client devrait être dans le main.
                          A moins que tu n'aie besoin d'une liste générale de voitures, la liste de voitures de chaque client suffit largement.

                          Un constructeur sert à construire un objet, et c'est tout - mais ça peut être relativement conséquent.

                          Si tu as besoin de rechercher tes clients par nom, deux solutions :
                          1- Soit tu crées une méthode qui te trouve le bon client dans la liste.
                          2- Soit tu maintiens une Map (tableau associatif) : nom --> client.
                          Idem avec les voitures et les immatriculations.
                          Ni la méthode, ni la Map ne se trouvent dans la classe Client (ou Voiture).

                          Voilà, il y a encore énormément de détails, mais déjà avec ça tu devrais pouvoir réécrire ton code de manière à ce qu'il fonctionne correctement.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 mai 2011 à 22:42:40

                            Argh!!

                            Je suis pieds et poings liés à ce modèle, c'est notre prof qui nous demande de faire ainsi.

                            Lors du 1er cours le tableau de client était bien dans le main(c'est ce qu'il nous avait demandé) puis lorsuq'il a attaqué sur le constructeur, il nous a demandé de déplacer ce même tableau dans la classe.

                            A qui faire confiance....?

                            ps: j'aime beaucoup ton avatar.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 mai 2011 à 23:16:12

                              Votre *prof* vous dit de coller une liste de Client dans la classe Client ?

                              Heu...
                              Arrête d'aller à ses cours et apprends par toi-même, là il y a un problème !

                              Plus sérieusement :
                              - Demande lui pourquoi ce choix (de préférence devant la classe).
                              - Un choix d'architecture (c'en est un à son niveau) doit TOUJOURS être justifiable par une meilleur raison que "je suis le prof et je veux que ça soit fait comme ça". Au besoin, demande-lui l'intérêt pédagogique de la chose.
                              - S'il persiste et qu'il a le temps, fait l'exo correctement + la version pourrie du prof pour éviter d'avoir une note de merde.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                27 mai 2011 à 0:02:52

                                moi je pense que ton main doit contenir une liste de clients , et que chaque client contienne une liste de ses voitures.
                                Tu as peut être mal compris
                                il a du vous dire de reproduire une liste dans chaque client pour y stocker ses voitures mais surement pas une liste de client ça n'a pas de sens
                                • Partager sur Facebook
                                • Partager sur Twitter

                                J'en demande trop au constructeur?

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown