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

Java Discussion :

Switch et enum


Sujet :

Java

  1. #1
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut Switch et enum
    Bonjour,

    j'ai créer une Enum du style

    Code Java : 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
     
    public enum ActionName {
     
            createAccount,
            logAccount,
            updateAccount,
            forgottenPassword,
            forgottenLogin,
            addMailAccount,
            selectMailAccount,
            udpateMailAccount,
            deleteMailAccount,
            writeMail,
            readMail,
            selectMail,
            deleteMail,
            addBlackListSender,
            removeBlacklistSender,
            answerMail,
            forwardMail,
            sendMail,
            downloadPicture;  
    }

    Je veux l'utiliser dans un switch j'ai donc fait

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     String action = e.getActionCommand();
     
            switch(action){
                case ActionName.addBlackListSender.toString() : 
                    System.out.println(action); 
                    break;
                default :
                    break;
            }

    J'ai une erreur sur le premier case me disant constant string expression required.
    Comment utiliser les valeur de mon enum ?
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Dans un case de switch, on ne peut mettre que des constantes. Donc pour une enum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch ( ) {
        case createAccount:
             ...
     
    }
    Même si ici toString() renvoit une constante, on ne peut pas le faire.

    Tu pourrais t'en sortir en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     String action = e.getActionCommand();
     
            switch(ActionName.valueOf(action)){
                case addBlackListSender: // (on indique jamais le nom de la classe d'enum dans le case).  
                    System.out.println(action); 
                    break;
                default :
                    break;
            }
    Sache que depuis Java 7, on peut utiliser des valeurs de String en constante pour les switch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     String action = e.getActionCommand();
     
            switch(action){
                case "addBlackListSender":   
                    System.out.println(action); 
                    break;
                default :
                    break;
            }
    Donc, tu peux définir une classe avec des public static final pour les noms d'actions et les utiliser dans le switch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class ActionName {
     
            public static final String ADD_BLACK_LIST8SENDER = "addBlackListSender";
     
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     String action = e.getActionCommand();
     
            switch(action){
                case ActionName.ADD_BLACK_LIST8SENDER:   
                    System.out.println(action); 
                    break;
                default :
                    break;
            }

    Enfin, avec une enum, tu as aussi une solution pour te dispenser du switch, en mettant l'action qui fait le code dans la classe d'enum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     String action = e.getActionCommand();
     
            ActionName.valueOf(action).executer( avec des paramètres éventuellement ); // par exemple
    Tu me diras, ça ne fait que déplacer le switch dans cette méthode, mais au moins, on peut utiliser la méthode de plusieurs endroits sans avoir à la réécrire plusieurs fois. On peut également sans sortir en stockant une action dans l'instance d'enum (action swing par exemple, ou interface fonctionnelle personalisée) ce qui permet éventuellement d'utiliser les lambdas en java 8 pour définir plus facilement les actions (éventuellement, utiliser l'interface Function de Java 8)

    On peut également utiliser l'enum comme une fabrique (singleton) d'action, qu'on affecte directement au générateur d'event ActionEvent, ce qu'il fait qu'on a même plus besoin d'implémenter de méthode actionPerformed.

    On peut aussi implémenter ActionListener sur l'enum :

    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
    public enum ActionName implements ActionListener {
     
     
            createAccount,
            ...;
     
            public void actionPerformed(ActionEvent e) {
                    if ( e.getActionCommand().equals(name()) ) {
                        switch(this) {
                             case createAccount:
                                 break;
                             ...
                        }
                    }
                    else {
                           throw new IllegalStateException("Mauvaise action: " + name() + " vs "+ e.getActionCommand());
                    }
            }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Bonne utilisation de enum et switch
    Par hibou107 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 10/04/2010, 10h44
  2. switch et enum
    Par verbose dans le forum Langage
    Réponses: 8
    Dernier message: 24/02/2010, 13h48
  3. switch avec un Enum
    Par rtg57 dans le forum Langage
    Réponses: 4
    Dernier message: 20/02/2010, 18h27
  4. switch case, enums, if ?
    Par skillipo dans le forum Langage
    Réponses: 3
    Dernier message: 08/07/2008, 17h29
  5. Réponses: 6
    Dernier message: 26/01/2003, 13h45

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