Partage
  • Partager sur Facebook
  • Partager sur Twitter

Instanciation objet en fonction d'une condition

Sujet résolu
    30 mars 2015 à 7:09:48

    Bonjour,

    Je butte sur un problème qui vous semblera certainement bête mais voilà :euh: ... . Si vous pouviez m'éclairer ce serai sympa :).

    Je veux instancier un objet en fonction d'une condition mais j'y arrive pas.

    Pour résumer, j'ai une class véhicule et une class automobile qui hérite de la première. Par la suite je compte faire des class camion et camionette.

    Je voudrais dans un premier temps avant d'aller plus loin instancier un objet auto de la class automobile en fonction du choix fait par l'utilisateur dans un menu.

    Voici mon code, mais il ne fonctionne pas :(.

    public class ExploitationVehicule {
    
    	public static void main(String[] args) {
    		// TODO Stub de la méthode généré automatiquement
    
    		Scanner sc = new Scanner(System.in);
    		int choix;
    		
    		do {
    			System.out.println("-1- Automobile");
    			System.out.println("-2- Camion");
    			System.out.println("-3- Camionette\n");
    			
    			System.out.println("Votre choix ? : ");
    			
    			choix = sc.nextInt();
    		} while (choix < 1 || choix > 3);
    		
    		
    		if(choix == 1){
    			Cautomobile auto = new Cautomobile();
    		}
    
    		auto.setProprietaire("oli");
    		System.out.println(auto.getProprietaire());		
    	}
    }

    Si vous pouviez me dire ce que je fais pas bien ou ce que je dois changer :o ?

    Merci pour votre aide.

    -
    Edité par o-live 30 mars 2015 à 7:26:01

    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2015 à 7:41:01

      Bonjour,

      Tu déclares la variable auto dans le if. Donc, quand tu sors du if, auto n'existe plus.

      La solution est de déclarer auto avant le if.

      • Partager sur Facebook
      • Partager sur Twitter
        30 mars 2015 à 8:07:58

        Automobile auto;
        if (choix == 1)
            auto = new Automobile();
        else if (choix == 2)
            auto = new Camion();
        else if (choix == 3)
            auto = new Camionette();
        else
            throw new IllevalArgumentException();
        • Partager sur Facebook
        • Partager sur Twitter
        Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
          30 mars 2015 à 9:36:28

          Automobile auto;
          Camionnette  camionnette;
          Camion camion;
          
          switch (choix)
          {
            
            case 1:
              auto = new Automobile();
              break;
            case 2:
              camionnette = new Camionnette();
              break;
            case 3:
              camion = new Camion();
              break;
            default:
              System.out.println("Je n'ai pas compris votre choix");
          }

          Bonjour,

          Moi j'aurais une préférence pour utiliser un switch !

          Azourkaï

          -
          Edité par Azourkaï 30 mars 2015 à 9:36:41

          • Partager sur Facebook
          • Partager sur Twitter
          Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
            30 mars 2015 à 9:58:46

            Oui, enfin AzourKai ta solution n'est pas optimisée, il devrait plutôt avoir une classe mère de style "Véhicule" pour les caractéristiques communes :

            Vehicule leVehicule;
             
            switch (choix){ 
              case 1:
                leVehicule = new Automobile();
                break;
              case 2:
                leVehicule = new Camionnette();
                break;
              case 3:
                leVehicule = new Camion();
                break;
              default:
                throw new IllegalArgumentException();
            }



            • Partager sur Facebook
            • Partager sur Twitter
              30 mars 2015 à 10:06:04

              Effectivement.
              Mais l'esprit y est :magicien:

              • Partager sur Facebook
              • Partager sur Twitter
              Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                30 mars 2015 à 11:54:14

                Oui, zumbaide c'est vraiment logique, mais je n'avais pas vu qu'il possédait une class mère véhicule :euh:.

                au temps pour moi. ^^

                Azourkaï

                • Partager sur Facebook
                • Partager sur Twitter
                Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
                  30 mars 2015 à 13:22:24

                  Re,

                  Merci pour vos réponses. J'ai fais ce que vous m'avez dis malheureusement mon compilateur me dit "la variable locale auto n'a pas été initialisée" :(.

                  Sauf erreur de ma part quand je fais 

                  auto = new Cautomobile();

                  j'instancie mon objet auto en faisant appel au constructeur de ma class automobile qui lui même appel implicitement le constructeur de ma class vehicule. Les attributs de mes class sont initialisés dans mes constructeurs. Oùu est le problème alors ?

                  Voici ci-dessous mon code modifié suivant vos explications.

                  public class ExploitationVehicule {
                   
                      public static void main(String[] args) {
                          // TODO Stub de la méthode généré automatiquement
                   
                          Scanner sc = new Scanner(System.in);
                          int choix;
                           
                          do {
                              System.out.println("-1- Automobile");
                              System.out.println("-2- Camion");
                              System.out.println("-3- Camionette\n");
                               
                              System.out.println("Votre choix ? : ");
                               
                              choix = sc.nextInt();
                          } while (choix < 1 || choix > 3);
                           
                          Cautomobile auto;
                  
                          if(choix == 1){
                              auto = new Cautomobile();
                          }
                   
                          auto.setProprietaire("Blabla");
                          System.out.println(auto.getProprietaire());    
                      }
                  }

                  Précision, les méthodes setPropriétaire et getPropriétaire appartiennent à ma class véhicule. Mais ma class automobile héritant de la class véhicule, cela ne devrait pas poser problème.

                  Donc, je comprend pas ... :o.

                  -
                  Edité par o-live 30 mars 2015 à 13:25:09

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 mars 2015 à 13:58:54

                    Parce que si tu ne rentres pas dans le if ligne 21, alors ta variable auto n'est pas initialisée.

                    Par défaut la variable pourrait valoir null, mais le compilateur avertie le compilateur pour signaler qu'il est possible qu'aucune valeur ne soit affectée à la variable.

                    Tu pourrais faire une des 2 solutions :

                    Cautomobile auto;
                    if (choix == 1)
                        auto = new Cautomobile();
                    else
                        auto = null;

                     ou

                    Cautomobile auto = null;
                    if (choix == 1)
                        auto = new Cautomobile();

                    Personnellement je choisierais la 1ème solution.
                    Tu sépares la déclaration de la variable, de la construction en fonction de l'état.
                    Alors que dans la 2nd solution on pourrait penser que le fait que choix soit égal à 0 est un "cas particulié".
                    Mais ce n'est qu'une question de point de vue, car le résultat est le même.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                      30 mars 2015 à 14:01:50

                      Le problème que tu as regard bien tu crée un objet Cautomobile sans l'instancier.

                      puis si choix == 1 alors tu instancie ton objet

                      mais si choix != 1 alors tu ne l’instancie pas et tu essais de  travailler dessus par la suite (ligne 25)

                      Azourkai

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
                        30 mars 2015 à 18:30:39

                        Re,

                        Merci pour votre aide, cela fonctionne :).

                        Voici le code final,

                        public class ExploitationVehicule {
                        
                        	public static void main(String[] args) {
                        		// TODO Stub de la méthode généré automatiquement
                        
                        		Scanner sc = new Scanner(System.in);
                        		int choix;
                        		
                        		do {
                        			System.out.println("-1- Automobile");
                        			System.out.println("-2- Camion");
                        			System.out.println("-3- Camionette\n");
                        			
                        			System.out.println("Votre choix ? : ");
                        			
                        			choix = sc.nextInt();
                        		} while (choix < 1 || choix > 3);
                        		
                        		Cautomobile auto = null;
                        		/*Ccamion camion = null;
                        		Ccamionette camionette = null;*/
                        		
                        		switch (choix) {
                        		case 1:
                        			auto = new Cautomobile();
                        			break;
                        		case 2:
                        			//camion = new Ccamion(); 
                        			break;
                        		case 3:
                        			//camionette = new Ccamionette();
                        			break;
                        		}
                        				
                        		auto.setProprietaire("Blabla");
                        		System.out.println(auto.getProprietaire());		
                        	}
                        }

                        Je dois encore implémenter mes class Ccamion et Ccamionette, c'est pourquoi elles sont en commentaires.

                        Par contre, je suis obliger d'utiliser la deuxième solution proposée par Pinguet62 sinon le compilateur n'est pas content. C'est dommage :(, j'aimais bien la première solution.

                        Si je comprend bien dans le cas présent et je peu certainement prendre cela comme généralité, sauf avis ou remarque contraire de l'un d'entre vous, il est toujours préférable d'initialiser ses variables à null tant qu'on ne les utilises pas! Correct ? Vous allez sans doute me dire que c'est évident :honte:.

                        Merci pour vos réponses en tous cas :).

                        -
                        Edité par o-live 30 mars 2015 à 21:03:08

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 mars 2015 à 18:37:34

                          non tu peux faire la 2ieme solution.

                           
                                  Vehicule vehicule;
                                   
                                  switch (choix) {
                                  case 1:
                                      vehicule = new Cautomobile();
                                      break;
                                  case 2:
                                      vehicule = new Ccamion();
                                      break;
                                  case 3:
                                      vehicule = new Ccamionette();
                                      break;
                                  default:
                                      vehicule = null;
                                  }
                                           
                                  vehicule.setProprietaire("Blabla");
                                  System.out.println(vehicule.getProprietaire()); 

                           Azourkaï

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
                            30 mars 2015 à 21:07:24

                            Bonsoir Azourkai,

                            Je pensai comme toi et pourtant à mon grand étonnement la solution que tu me donne ne fonctionne pas :euh:. Pourquoi ?

                            Je travaille sous éclipse, mais je ne crois pas qu'il y ai un lien de cause à effet.

                            Si quelqu'un sais nous dire pourquoi cette solution ne fonctionne pas ? je suis à l'écoute :p.

                            Merci.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 mars 2015 à 21:13:24

                              Ca ne fonctionne pas, c'est vague. tu as un bout de code et une erreur à montrer ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 mars 2015 à 22:01:33

                                Re,

                                Voici l'erreur que j'ai à l'affichage

                                Exception in thread "main" java.lang.Error: Problèmes de compilation non résolus : 
                                	La variable locale auto n'a peut-être pas été initialisée
                                	La variable locale auto n'a peut-être pas été initialisée

                                et le code 

                                public class ExploitationVehicule {
                                
                                	public static void main(String[] args) {
                                		// TODO Stub de la méthode généré automatiquement
                                
                                		Scanner sc = new Scanner(System.in);
                                		int choix;
                                		
                                		do {
                                			System.out.println("-1- Automobile");
                                			System.out.println("-2- Camion");
                                			System.out.println("-3- Camionette\n");
                                			
                                			System.out.println("Votre choix ? : ");
                                			
                                			choix = sc.nextInt();
                                		} while (choix < 1 || choix > 3);
                                		
                                		Cautomobile auto;
                                		/*Ccamion camion = null;
                                		Ccamionette camionette = null;*/
                                		
                                		switch (choix) {
                                		case 1:
                                			auto = new Cautomobile();
                                			break;
                                		case 2:
                                			//camion = new Ccamion(); 
                                			break;
                                		case 3:
                                			//camionette = = new Ccamionette();
                                			break;
                                		default:
                                			auto = null;
                                		}
                                				
                                		auto.setProprietaire("oli");
                                		System.out.println(auto.getProprietaire());		
                                	}
                                }

                                Comme je l'ai dis, je dois encore implémenter mes class Ccamion et Ccamionette. C'est pourquoi elles sont en commentaire.

                                Merci.

                                -
                                Edité par o-live 30 mars 2015 à 22:39:43

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 mars 2015 à 22:24:43

                                  c'est normal on te la expliquer si choix = 2 ou choix = 3, l'objet auto n'est pas instancier.

                                  crée ta class camion et camionette.

                                  et remplace Cautomobile auto; par la classe mère Vehicule.

                                  Vehicule vehicule;
                                    
                                  switch (choix) {
                                  case 1:
                                      vehicule = new Cautomobile();
                                      break;
                                  case 2:
                                      vehicule = new Ccamion();
                                      break;
                                  case 3:
                                      vehicule = new Ccamionette();
                                      break;
                                  default:
                                      vehicule = null;
                                  }



                                  Azourkaï

                                  -
                                  Edité par Azourkaï 30 mars 2015 à 22:48:30

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
                                    31 mars 2015 à 8:21:01

                                    Tu as basé ton modèle sur l'héritage, ce qui est très bien.
                                    Par contre si tu n'utilises pas ça dans ton programme tu perds tout cet avantage.

                                    C'est pour cela qu'il est préférable de définir ta variable de type Vehicule.
                                    Ensuite tu instancies l'implémentation que tu souhaites.
                                    Voir solution de Azourkaï.

                                    Utiliser 1 variable pour chacun des cas possibles dans ton switch n'est pas une solution, car pour savoir laquelle utiliser par la suite tu devras toujours utiliser un switch.

                                    Au passage : pourquoi préfixer tes noms de classe par un "C" ?
                                    Appelle les normalement.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                                      31 mars 2015 à 8:45:24

                                      Ok Pinguet62.

                                      Cela veux t-il dire que dès que j'utilise l'héritage, si je ne sais pas quel objet je vais instancier il est préférable que je déclare un objet du type de ma class mère. Même si plusieurs class dépendent de celle-ci ?

                                      Je comprend pas très bien :o. C'est pour éviter de déclarer trois variable différentes style Cautomobile auto, Ccamion camion et Ccamionette camionette ? C'est bien cela et juste pour cela ? Ai-je bien compris la raison ?

                                      Le "C" pour mes class est juste une façon de faire pour voir clair dans mon code. Mais je tiendrais compte de ta remarque à l'avenir.

                                      -
                                      Edité par o-live 31 mars 2015 à 9:00:15

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        31 mars 2015 à 9:30:55

                                        Tu as 2 classes qui héritent d'une interface :

                                        interface Vehicule {
                                            void avancer();
                                        }
                                        
                                        class Voiture implements Vehicule {}
                                        class Moto implements Vehicule {}

                                        Pour instancier tu n'as pas trop le choix (patron Factory) :

                                        Vehicule v;
                                        switch (...) {
                                            case 1:
                                                v = new Voiture();
                                                break;
                                            case 2:
                                                v = new Moto();
                                                break;
                                            default:
                                                v = null;
                                        }

                                        Pour utiliser ton objet rien de plus simple :

                                        v.avancer();

                                        Le même exemple avec ce que tu as fait :

                                        Voiture voiture = null;
                                        Moto moto = null;
                                        switch (...) {
                                            case 1:
                                                voiture = new Voiture();
                                                break;
                                            case 2:
                                                moto = new Moto();
                                                break;
                                        }
                                        
                                        if (voiture != null)
                                        	voiture.avancer();
                                        else if (moto != null)
                                            moto.avancer();

                                        Tu vas dupliquer ton switch pour chacun des actions que tu voudras exécuter.
                                        Tu dupliqueras ton code autant de fois que tu auras de types possibles.
                                        A chaque fois que tu créeras un nouveau type, tu devras repasser sur tout ton code.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                                          31 mars 2015 à 9:38:09

                                           tes classe Cautomobile, Ccamion, Ccamionette étend bien de véhicule.

                                          Donc toute les classe qui possède la classe mère Véhicule sont des véhicules pas vrais ?

                                          Donc si je fais Vehicule monVehicule = new Cautomobile();  je crée un véhicule qui sera une automobile.

                                          Oui c'est bien ça tu n'a pas besoin de réservé une place mémoire pour Cautomobile, Ccamion, Ccamionette, car tu n'en utilisera seulement un seul.

                                          Donc on réserve une seule place mémoire véhicule car ce sont tous des véhicule ( Vehicule monVehicule; ).

                                          Puis on l’instancie avec un camion ou automobile... ( monVehicule = new Ccamion; )

                                          Azourkaï

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
                                            31 mars 2015 à 9:41:49

                                            Pinguet62 a écrit:

                                            Tu as 2 classes qui héritent d'une interface :

                                            interface Vehicule {
                                                void avancer();
                                            }
                                            
                                            class Voiture implements Vehicule {}
                                            class Moto implements Vehicule {}

                                            Je ne pense pas qu'il a vu les interface c'est peut être un peux tôt encore. 

                                            Azourkaï



                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
                                              31 mars 2015 à 11:19:43

                                              Effectivement Azourkaï, je n'ai pas encore vu les interfaces. Je pense cependant en comprendre le principe. Peut-être pouvez-vous m'éclairer d'avantage sur cet aspect :).

                                              Dans le cas présent pourquoi j'utiliserai une interface ? Les méthodes comme void avancer() mentionnée par Pinguet62 peuvent très bien faire partie de ma class Cvehicule.

                                              Pourquoi utiliser une interface dans mon cas ? Avantages ? Inconvénients ? 

                                              Merci.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                31 mars 2015 à 11:33:28

                                                Dans mon exemple j'utilise une interface par réflexe.
                                                Mais cela fonctionne exactement de la même manière pour une classe (abstraite ou non).

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                                                  31 mars 2015 à 20:11:57

                                                  Merci pour vos réponses :).

                                                  Si je peux abuser juste pour la route ... et profiter de votre expérience :D.

                                                  Dans mon cas, une interface n'a pas trop d'intérêt dans le sens ou cela m'imposerai de réécrire des méthodes alors qu'elle sont disponibles dans ma class Cvehicule. Correct ?

                                                  Pouvez-vous me donner un exemple parlant de l'usage d'une interface ?

                                                  Merci.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    31 mars 2015 à 20:48:57

                                                    regarde la tu va comprendre

                                                    http://openclassrooms.com/courses/apprenez-a-programmer-en-java/les-classes-abstraites-et-les-interfaces

                                                    Mais dans ton cas personnellement je ne pense pas qu'une interface est pas nécessaire, juste déclarer la classe véhicule comme classe abstraite suffirai. 

                                                    Azourkaï

                                                    -
                                                    Edité par Azourkaï 31 mars 2015 à 20:53:24

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide.
                                                      31 mars 2015 à 20:49:32

                                                      Si tu as des méthodes et attributs communes dans tes classes, alors l'héritage c'est bien.

                                                      Les interfaces ont une philosophie différente.
                                                      Je ne vais pas rentrer dans les détails car ce sont des notions POO.

                                                      L'utilisation est presque la même, avec ses avantages et ses limites.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                                                        1 avril 2015 à 20:48:43

                                                        Re,

                                                        Désolé :o j'ai eu un imprévu et cela ... . Enfin bref, merci de m'avoir éclairé et d'avoir partagé vos connaissances :p.

                                                        J'aurais à coup sûr d'autre question sur lesquelles vous certainement m'aider, mais ce sera pour une autre fois.

                                                        Encore merci :).

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Instanciation objet en fonction d'une condition

                                                        × 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