maVar nouvelObjet = new maVar()

maVar nouvelObjet = new maVar() - Java - Programmation

Marsh Posté le 17-11-2009 à 17:20:45    

Bonjour,
 
   J'ai le nom d'une classe dans une variable String maVar par exemple.  
Et je veux faire un nouvel objet de type maVar... quelle est la synthaxe à utiliser, si elle existe, je sais que tous les langages ne sont pas réflexifs (comme C++ si je ne m'abuse)
 
Merci

Reply

Marsh Posté le 17-11-2009 à 17:20:45   

Reply

Marsh Posté le 17-11-2009 à 17:27:52    

je sais pas si ya mieux, mais tu dois pouvoir faire:

Code :
  1. NomDeTaClasse o = (NomDeTaClasse) Class.forName("nom de ta classe" ).newInstance();


http://java.sun.com/j2se/1.5.0/doc [...] Class.html


Message édité par pataluc le 17-11-2009 à 17:29:30
Reply

Marsh Posté le 17-11-2009 à 17:36:39    

Merci mais je crois que je me suis mal exprimé ...
 
J'ai une liste de catégorie d'objet dans un String[]
 
   String[] listeCatObj={"Meubles","Fournitures","Divers"};
 
Avec un for qui va bien j'affiche  
 
  0 - Meubles
  1 - Fournitures
  2 - Divers
 
Je demande à l'utilisateur de taper un chiffre au clavier et je veux faire dans le cas où il tape 1 par exemple
Fournitures monNouvelObjet = new Fournitures();
et dans le cas où il tape 2
Divers monNouvelObjet = new Divers();
 
En gros si je recupere le choix de l'utilisateur dans la var maVar
   maVar monNouvelObjet = new maVar();
 
...


Message édité par M Orthographe le 17-11-2009 à 17:38:51
Reply

Marsh Posté le 17-11-2009 à 17:56:55    

ma réponse n'est pas incompatible... par contre il va bien te falloir pouvoir type cet objet de manière générique...

Reply

Marsh Posté le 17-11-2009 à 18:17:02    

et bien les trois héritent de la classe ObjetMaison
 
je fais donc  

Code :
  1. try {
  2. ObjetMaison o = (ObjetMaison) Class.forName(listC.getCatObj(i)).newInstance();
  3. }
  4. catch (InstantiationException e) {
  5.      // TODO Auto-generated catch block
  6.      e.printStackTrace();
  7.     } catch (IllegalAccessException e) {
  8.      // TODO Auto-generated catch bloc
  9.      e.printStackTrace();
  10.     } catch (ClassNotFoundException e) {
  11.      // TODO Auto-generated catch block
  12.      e.printStackTrace();
  13.     }


 
??
 
où listC.getCatObj(i) renvoie bien ce que je veux


Message édité par M Orthographe le 17-11-2009 à 18:18:16
Reply

Marsh Posté le 17-11-2009 à 18:30:39    

Tu ferais mieux de stocker Meubles, Fournitures et le reste sous le type Class dans ta liste plutôt que sous la forme de chaînes de caractères.
 

Code :
  1. Class<?>[] listeCatObj = { Meubles.class, Fournitures.class, Divers.class };


 
Comme ça tu n'as plus qu'à faire:
 

Code :
  1. ObjetMaison o = (ObjetMaison) listeCatObj[i].newInstance();


Message édité par cbeyls le 17-11-2009 à 19:00:52
Reply

Marsh Posté le 17-11-2009 à 23:33:23    

Je préfère la réponse de pataluc (qui marche à merveille) pour des raisons de maintenance. Merci à vous deux :)

Reply

Marsh Posté le 18-11-2009 à 05:21:35    

Ma version est plus sûre et plus facile à maintenir puisque si l'une des classes n'existe pas ou que tu fais une faute de frappe dans le nom de la classe, le code ne compilera pas. Imagine que tu fais un refactor automatique afin de renommer ta classe "Autres" en "Divers" plus tard par exemple, si tu encodes le nom de la classe en dur sous forme de chaîne de caractères le compilateur ne dira rien alors que ta chaîne sera toujours "Autres" au lieu de "Divers" et boum ça plantera plus tard à l'exécution. Tandis que si tu utilises Autres.class et que tu fais le même refactor, il sera automatiquement modifié en Divers.class donc plus facile à maintenir et pas de surprise à l'exécution.
 
De plus ma version est plus rapide puisque l'opération consistant à rechercher la classe correspondant à un nom donné ne doit plus être effectuée à l'exécution. On prend juste la classe dans le tableau et on l'instancie.


Message édité par cbeyls le 18-11-2009 à 05:23:19
Reply

Marsh Posté le 19-11-2009 à 16:32:29    

ouais battez-vous :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed