124 votes

Java utilisant un enum avec une instruction switch

J'ai consulté plusieurs questions-réponses sur SO similaires à cette question, mais je n'ai pas trouvé de solution.

Ce que j'ai, c'est un enum qui représente les différentes façons d'afficher un guide TV...

Dans le NDroid Application classe

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

...lorsque l'utilisateur modifie la vue, un gestionnaire d'événement reçoit un message int de 0 à 2 et j'aimerais faire quelque chose comme ça...

Dans un système Android Activity onClick(DialogInterface dialog, int which) gestionnaire d'événements

// 'which' is an int from 0-2
switch (which) {
    case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
    ...
    break;
}

Je suis habitué aux enums C# et aux instructions select/case qui permettraient quelque chose comme ce qui précède et je sais que Java fait les choses différemment mais je n'arrive pas à comprendre ce que j'ai besoin de faire.

Vais-je devoir recourir à if déclarations ? Il n'y aura probablement jamais plus de 3 choix, donc je pourrais le faire, mais je me demandais comment cela pourrait être fait avec switch-case en Java.

EDIT Désolé, je n'ai pas complètement développé le problème, car je pensais qu'il s'agissait d'un problème générique lié à Java. J'ai ajouté un complément à la question pour expliquer un peu plus en détail.

Il n'y a rien de spécifique à Android, c'est pourquoi je ne l'ai pas étiqueté comme Android, mais l'énumération est définie dans le fichier Application et le code où je veux l'interrupteur se trouve dans une classe de Activity . L'énumération est statique car je dois y accéder à partir de plusieurs activités.

183voto

Ophidian Points 3431

La partie qui vous manque est la conversion de l'entier à l'énumération sûre. Java ne le fait pas automatiquement. Vous pouvez procéder de deux manières différentes :

  1. Utilisez une liste d'ints statiques finaux plutôt qu'un enum sûr et basculez sur la valeur int que vous recevez (c'est l'approche pré-Java 5).
  2. Activer soit une valeur d'identification spécifiée (comme décrit par heneryville ) ou la valeur ordinale des valeurs de l'énumération, c'est-à-dire guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. Déterminez la valeur de l'énumération représentée par la valeur int et activez la valeur de l'énumération.

    enum GuideView {
        SEVEN_DAY,
        NOW_SHOWING,
        ALL_TIMESLOTS
    }
    
    // Working on the assumption that your int value is 
    // the ordinal value of the items in your enum
    public void onClick(DialogInterface dialog, int which) {
        // do your own bounds checking
        GuideView whichView = GuideView.values()[which];
        switch (whichView) {
            case SEVEN_DAY:
                ...
                break;
            case NOW_SHOWING:
                ...
                break;
        }
    }

    Vous trouverez peut-être plus utile / moins sujet à erreur de rédiger un document personnalisé. valueOf qui prend vos valeurs entières comme argument pour résoudre la valeur appropriée de l'enum et vous permet de centraliser votre vérification des limites.

49voto

Dhanushka Points 71

Si whichView est un objet de l'Enum GuideView, ce qui fonctionne bien. Veuillez noter qu'il n'y a pas de qualificatif pour la constante après case .

switch (whichView) {
    case SEVEN_DAY:
        ...
        break;
    case NOW_SHOWING:
        ...
        break;
}

15voto

Piyush Points 6137

Les énumérations ne doivent pas être qualifiées dans l'étiquette de cas, comme c'est le cas ici. NDroid.guideView.GUIDE_VIEW_SEVEN_DAY Au lieu de cela, vous devriez supprimer la qualification et utiliser GUIDE_VIEW_SEVEN_DAY

5voto

heneryville Points 1124

Les enums Java sont assez différents des enums C#. En C#, il s'agit en fait d'une extension d'un groupe de constantes, alors qu'en Java, il s'agit plutôt d'une liste finie d'objets d'une seule classe. Vous pouvez tirer parti de cette différence pour créer un enum qui fonctionnera ici.

public enum GuideView {
  GUIDE_VIEW_SEVEN_DAY(0),
  GUIDE_VIEW_NOW_SHOWING(1),
  GUIDE_VIEW_ALL_TIMESLOTS(2);

  private int eventID;

  GuideView(int eventID) {
    this.eventID = eventID;
  }

  public int getEventID() { return eventID;}
}

L'instruction de commutation utilisera alors cette valeur :

switch (which) {
  case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY.getEventID():
  ...
  break;
}

5voto

david m lee Points 1

J'aime quelques utilisations de Java enum :

  1. .name() permet de récupérer le nom de l'enum dans une chaîne de caractères.
  2. .ordinal() permet d'obtenir une valeur entière, basée sur 0.
  3. Vous pouvez associer d'autres paramètres de valeur à chaque énumération.
  4. et, bien sûr, le commutateur est activé.

enum avec des paramètres de valeur :

    enum StateEnum {
        UNDEFINED_POLL  ( 1 * 1000L,       4 * 1000L),
        SUPPORT_POLL    ( 1 * 1000L,       5 * 1000L),
        FAST_POLL       ( 2 * 1000L,  4 * 60 * 1000L),
        NO_POLL         ( 1 * 1000L,       6 * 1000L); 
        ...
    }

exemple de commutateur :

private void queuePoll(StateEnum se) {
    // debug print se.name() if needed
    switch (se) {
        case UNDEFINED_POLL:
            ...
            break;
        case SUPPORT_POLL:
            ...
            break;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X