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

Langage Java Discussion :

switch avec un Enum


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 342
    Par défaut switch avec un Enum
    Bonsoir,

    quelqu'un peut-il m'expliquer comment faire pour utiliser un switch qui compare un int, a des valeur d'énumération ?
    Exemple:

    L'énumération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public enum enumChamps {
      C1 ("Champ1"),
      C2 ("Champ2"), 
      C3 ("Champ3");
     
      /.../
    }
    Puis dans une méthode d'une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public methodeX(int x) {
     
      switch (x) {
      case C1:
        Bla bla pour c1;
        break;
     
      case C2:
      /.../
    L'idée est de savoir à quel élément d'énumération correspond 'x'.
    Je ne sais pas comment récupérer le fait que C1 est le 1er élément de l'énumération, C2 le deuxième...

    ordinal() me donne la position de chaque éléments de l'énumération. Mais lorsque je tente la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case enumChamps.C1.ordinal():
    on me répond que Les expressions de case doivent correspondre à des constantes.
    Et je tourne en rond

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 44
    Par défaut
    Déjà ça sert ne sert à rien d'appeler ta fonction ordinal() dans le case vu que ta méthode reçoit un entier.

    Donc tu devrais faire ça :

    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
    	int i = enumChamps.C1.ordinal();
     
    		MethodeX(i);
     
    public  void MethodeX(int i){
     
    		switch (i) {
    	      case 0:
    	         System.out.println("************");
    	         break;
    	      case 1:
    	    	   System.out.println("************");
    	         break;
    	      case 3:
    	    	   System.out.println("************");
    	         break;
    	      case 4:
    	    	   System.out.println("************");
    	         break;
    	   }
    	}
    Mais bon c'est une autre façon, et ça ne répond pas tout à fait à la question.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pourquoi travailler avec un entier. Les switch/case enum, ca marche comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public methodeX(MonEnum x) {
     
      switch (x) {
      case MonEnum.C1:
        Bla bla pour c1;
        break;
     
      case MonEnum.C2:
      /.../
    Si pour des raisons obscures et impénétrable t'es obligé à tout prix de travailler avec un int (ce qui est une peu suicidaire dans beaucoup de cas, car l'ordre des enums peut avoir changé avec le temps et le but est justement d'éviter de repasser sur tout le code et à rajouter que le int n'est pas typé donc on peux facilement confondre les valeurs qu'on envoir), tu peux tenter ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public methodeX(int x) {
     
      switch (MonEnum.values()[x]) { // rajouter un peu de code our tester que x est bien dans le range ;)
      case MonEnum.C1:
        Bla bla pour c1;
        break;
     
      case MonEnum.C2:
      /.../

  4. #4
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 342
    Par défaut
    Merci pour vos réponses,

    pour être plus précis puisque la solution ne coule pas de source apparemment, cela se passe dans une classe qui étends AbstractTableModel

    La méthode en question est la surcharge de Object getValueAt(int, int)
    Le soucis est que cette méthode ne me passe pas des arguments de type de mon Enum.
    Le code présenté par azerty.123.450 est bien sympa, mais cela suppose que l'on sache quel élément de l'Enum on travaille. Or dans mon cas, je n'en sais rien.

    Par contre les colonnes de la table sont construites sur le modèle de l'Enum, et sont donc liées à celui-ci. getValueAt() me renvoie la colonne, et je n'ai pas envie de faire un switch avec des 1, 2, 3, mais avec les éléments de mon Enum.
    Ainsi si un jour, je décide de changer l'arrangement des mes colonnes, je le ferai au niveau de l'Enum.

    J'espère que ce n'est pas trop brouillon ce que je raconte

    Alors je teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    switch (MonEnum.values()[x])
    , et je vous tiens au courant...

    Marci et @ bientôt

  5. #5
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 342
    Par défaut
    Ouf ! La solution de tchize fonctionne
    Et le code est propre est clair, pour ceux que ça intéresse:

    Le code de l'énumération
    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
    public enum enumChamps
    {
      NMR_OP ("N°"),
      NMR_DATE ("DATE"), 
      ETAT_OP ("P"), 
      MONTANT_C ("CREDIT"),
      MONTANT_D ("DEBIT"),
      SOLDE_PREVU ("SOLDE PREVU"),
      SOLDE_REEL ("SOLDE REEL"),
      OBSERVATION ("OBSERVATIONS");
     
      private final String Libelle;
     
      // CONSTRUCTEUR:
      private enumChamps(String Texte)  { this.Libelle = Texte; }
     
      // INTERFACE:
      public String donneLibelle()  { return this.Libelle; }
    }
    Puis, dans la classe qui gère les données et qui étends AbstractTableModel:
    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
    @Override
    public Object getValueAt(int ligne, int colonne)
    {
      if (ligne >= getRowCount())
      {
        return null; // Index hors limite
      }
      else
      {
        switch(enumChamps.values()[colonne])
        {
        case NMR_OP:
          return m_Operations.get(ligne).donneNmrOP();
     
        case  NMR_DATE:
          return m_Operations.get(ligne).donneDate();
     
        case  ETAT_OP:
          return m_Operations.get(ligne).donneEtatOP();
     
        case  MONTANT_C:
          return m_Operations.get(ligne).donneMontantC();
     
        case  MONTANT_D:
          return m_Operations.get(ligne).donneMontantD();
     
        case  SOLDE_PREVU:
          return m_Operations.get(ligne).donneSoldePrevu();
     
        case  SOLDE_REEL:
          return m_Operations.get(ligne).donneSoldeReel();
     
        case  OBSERVATION:
          return m_Operations.get(ligne).donneObservation();
     
        default: // Arrivé ici signifie PROBLEME
          JOptionPane.showMessageDialog(null, "Erreur d'énumération, veuillez contacter le programmeur.", "ERREUR CTableDonnees.getValueAt", JOptionPane.WARNING_MESSAGE); 
          return null;
     
        }
      }
    }
    Si je change un jour mon énumération, je n'aurais pas à me préoccuper de l'ordre des colonnes...

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 'switch' avec du String
    Par schousso dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2015, 14h27
  2. pb connexion switch avec .bat
    Par bessonnet dans le forum Windows
    Réponses: 8
    Dernier message: 23/06/2006, 20h12
  3. Switch avec des variables
    Par Reven777 dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/05/2006, 13h30
  4. comment faire switch avec des strings ?
    Par ilimo dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2006, 21h08
  5. switch avec AnsiIndexStr
    Par Sunchaser dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/03/2006, 08h14

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