enum à plusieurs membres et switch

enum à plusieurs membres et switch - Java - Programmation

Marsh Posté le 21-12-2007 à 17:46:17    

Bonjour,
 
j'ai un petit soucis actuellement avec l'enum de java, que je souhaite utiliser avec un switch.
Basiquement, je voudrais utiliser le switch sur un type int (qui est final comme il se doit pour etre connu à la compilation),
mais j'obtiens quand même le traditionnel "case expressions must be constant expressions".
 
Voila le code de mon enum :
 

Code :
  1. public enum SubmenuItems {
  2. MENU_NEW (0, "New" ),
  3. MENU_OPEN (1, "Open" ),
  4. MENU_SAVE (2, "Save" ),
  5. MENU_SAVEAS (3, "Save As ..." ),
  6. MENU_PRINT (4, "Print" );
  7. public final int ID;
  8. public final String Name;
  9. SubmenuItems(int ID, String Name) {
  10.  this.ID = ID;
  11.  this.Name = Name;
  12. }
  13. }


 
Et le switch :

Code :
  1. int menu_ID = -1;
  2. ...
  3. switch (menu_ID) {
  4. case SubmenuItems.MENU_NEW.ID:
  5. ...
  6. break;
  7. }


 
Aurais-je raté quelque chose dans la déclaration de mon enum ?

Reply

Marsh Posté le 21-12-2007 à 17:46:17   

Reply

Marsh Posté le 21-12-2007 à 19:13:04    

Faut pas utiliser l'ID, faut directement utiliser l'enum

Message cité 1 fois
Message édité par masklinn le 21-12-2007 à 19:13:22

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-12-2007 à 20:43:26    

masklinn a écrit :

Faut pas utiliser l'ID, faut directement utiliser l'enum


 
Tu veux dire comme ca ?
 

Code :
  1. switch (menu_ID) {
  2. case SubmenuItems.MENU_NEW:
  3. ...
  4. break;
  5. }


 
Ca me sort un joli "Type mismatch: cannot convert from SubmenuItems to int"
Ce qui est comprehensible vu que MENU_NEW contient effectivement plusieurs champs, j'imagine qu'il faut lui specifier quand même d'une facon ou d'une autre celui qu'on veut utiliser ..

Reply

Marsh Posté le 21-12-2007 à 20:47:43    

Sp4M- a écrit :


 
Tu veux dire comme ca ?
 

Code :
  1. switch (menu_ID) {
  2. case SubmenuItems.MENU_NEW:
  3. ...
  4. break;
  5. }


 
Ca me sort un joli "Type mismatch: cannot convert from SubmenuItems to int"
Ce qui est comprehensible vu que MENU_NEW contient effectivement plusieurs champs, j'imagine qu'il faut lui specifier quand même d'une facon ou d'une autre celui qu'on veut utiliser ..


et pourquoi passe tu "l'index" de ton enum a la place de passer l'enum directement a ta méthode ?


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 21-12-2007 à 20:54:05    

zapan666 a écrit :


et pourquoi passe tu "l'index" de ton enum a la place de passer l'enum directement a ta méthode ?


 
Hum, à vrai dire parce que j'ai pas "tellement" le choix ... je travaille sur un enorme projet qui a été codé ainsi, et je ne dispose ici que de l'index de cet enum ... Mais ce serait effectivement surement plus simple de faire le switch sur l'enum complet si je pouvais, comme tu dis.
 
Si il n'y a vraiment aucune autre solution, j'essayerais de modifier le code pour recuperer l'enum plus tôt dans le code...  :jap:  
Mais je voulais m'assurer avant qu'il n'y avait pas une solution plus "soft" ;)

Reply

Marsh Posté le 21-12-2007 à 21:06:37    

Sp4M- a écrit :


 
Hum, à vrai dire parce que j'ai pas "tellement" le choix ... je travaille sur un enorme projet qui a été codé ainsi, et je ne dispose ici que de l'index de cet enum ... Mais ce serait effectivement surement plus simple de faire le switch sur l'enum complet si je pouvais, comme tu dis.
 
Si il n'y a vraiment aucune autre solution, j'essayerais de modifier le code pour recuperer l'enum plus tôt dans le code...  :jap:  
Mais je voulais m'assurer avant qu'il n'y avait pas une solution plus "soft" ;)


Crée une méthode statique dans ton énum genre fromId qui te servira à convertir ton ID moisi en un beau objet de l'enum.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-12-2007 à 21:24:17    

masklinn a écrit :

un beau objet de l'enum.


 
Hum .. On peut instancier un enum ?
 
J'ai quand même testé par curiosité mais : Cannot instantiate the type SubmenuItems

Reply

Marsh Posté le 21-12-2007 à 21:27:46    

Cela dit, le problème semble s'etendre un peu plus que ca ...
 
Même avec un
 

Code :
  1. SubmenuItems s;
  2.  switch(s) {
  3.   case SubmenuItems.MENU_NEW:
  4.   break;
  5.  }


 
On arrive à un : The enum constant SubmenuItems.MENU_NEW reference cannot be qualified in a case label
La j'suis un peu perdu pour le coup ...  :??:

Reply

Marsh Posté le 21-12-2007 à 21:28:31    

masklinn a écrit :


Crée une méthode statique dans ton énum genre fromId qui te servira à convertir ton ID moisi en un beau objet de l'enum.


Code :
  1. SubmenuItems.values()[menu_id] ;

?


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 21-12-2007 à 21:36:31    

zapan666 a écrit :


Code :
  1. SubmenuItems.values()[menu_id] ;

?


Aussi, mais c'est sale :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 21-12-2007 à 21:36:31   

Reply

Marsh Posté le 21-12-2007 à 21:39:02    

Ah oui aussi ... c'est un peu cowboy mais pourquoi pas, merci à vous deux ;)  
 
Cela dit, ca nous renvoit à l'autre probleme :
 

Code :
  1. switch(SubmenuItems.values()[menu_ID]) {
  2. case SubmenuItems.MENU_NEW:
  3. break;
  4. }


 
Renvoit : The enum constant SubmenuItems.MENU_NEW reference cannot be qualified in a case label

Message cité 1 fois
Message édité par Sp4M- le 21-12-2007 à 21:39:37
Reply

Marsh Posté le 22-12-2007 à 00:41:47    

Bon je me repond à moi même, mais voila la solution si ca interesse quelqu'un ...
 
Ce n'est pas :

Code :
  1. switch(SubmenuItems.values()[menu_ID]) {
  2. case SubmenuItems.MENU_NEW:
  3. break;
  4. }


 
mais (avec la methode cowboy de zapan666) :

Code :
  1. switch(SubmenuItems.values()[menu_ID]) {
  2. case MENU_NEW:
  3. break;
  4. }


 
ou :

Code :
  1. switch(SubmenuItems.fromID(menu_ID)) {
  2. case MENU_NEW:
  3. break;
  4. }


Si on veut faire effectivement plus propre.
 
merci  ;)


Message édité par Sp4M- le 22-12-2007 à 00:42:25
Reply

Marsh Posté le 22-12-2007 à 13:34:41    

oui mais non, mais là, ça marche car coup de pôt, l'index de l'enum colle avec les IDs que tu as mis :S
 
(inverse 2 lignes sur ton enum et tu aura des résultats incoherents)


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 14-02-2008 à 22:19:48    

Sp4M- a écrit :

Ah oui aussi ... c'est un peu cowboy mais pourquoi pas, merci à vous deux ;)  
 
Cela dit, ca nous renvoit à l'autre probleme :
 

Code :
  1. switch(SubmenuItems.values()[menu_ID]) {
  2. case SubmenuItems.MENU_NEW:
  3. break;
  4. }


 
Renvoit : The enum constant SubmenuItems.MENU_NEW reference cannot be qualified in a case label


 
Si tu fais d'abord un:

Code :
  1. import static com.monpackage.SubmenuItems.*


tu peux ensuite faire un case:

Code :
  1. switch(menu_ID) {
  2. case MENU_NEW:
  3. break;
  4. }

Reply

Sujets relatifs:

Leave a Replay

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