web-dev-qa-db-fra.com

Java utilisant enum avec une instruction switch

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

Ce que j'ai est une énumération qui représente différentes façons de regarder un guide TV ...

Dans la classe NDroid Application

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

... lorsque l'utilisateur change la vue, un gestionnaire d'événements reçoit un int de 0-2 et j'aimerais faire quelque chose comme ceci ...

Dans un gestionnaire d'événement Android ActivityonClick(DialogInterface dialog, int which)

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

Je suis habitué aux énoncés C # et aux instructions select/case qui autoriseraient quelque chose comme ce qui précède et je sais que Java fait les choses différemment, mais je ne peux tout simplement pas comprendre ce que je dois faire.

Est-ce que je vais devoir recourir à des déclarations if? Il n’y aura probablement que 3 choix pour que je puisse le faire, mais je me demandais comment faire avec switch-case en Java.

EDIT Désolé de ne pas avoir complètement développé le problème car je le considérais comme un problème générique Java. J'ai ajouté à la question pour expliquer un peu plus loin.

Il n'y a rien qui soit spécifique à Android, c'est pourquoi je ne l'ai pas étiqueté comme Android mais l'énumération est définie dans la classe Application et le code où je souhaite le commutateur est dans un Activity. L'énumération est statique car j'ai besoin d'y accéder à partir de plusieurs activités.

102
Squonk

La partie qui vous manque est la conversion du nombre entier en un type-safe. Java ne le fera pas automatiquement. Il y a deux façons de s'y prendre:

  1. Utilisez une liste d'ints finales statiques plutôt qu'une énumération sécurisée et activez la valeur int que vous recevez (c'est l'approche antérieure à Java 5)
  2. Activez une valeur id spécifiée (comme décrit par heneryville ) ou la valeur ordinale des valeurs enum; à savoir guideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. Déterminez la valeur enum représentée par la valeur int puis activez-la.

    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 enclin aux erreurs d'écrire une implémentation personnalisée valueOf prenant vos valeurs entières en tant qu'argument pour résoudre la valeur enum appropriée et vous permettant de centraliser la vérification de vos limites.

154
Ophidian

Si whichView est un objet de GuideView Enum, la procédure suivante fonctionne bien. Veuillez noter qu'il n'y a pas de qualificateur pour la constante après case.

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

Les énumérations ne doivent pas être qualifiées dans l'étiquette de casse comme ce que vous avez NDroid.guideView.GUIDE_VIEW_SEVEN_DAY, mais vous devez plutôt retirer la qualification et utiliser GUIDE_VIEW_SEVEN_DAY.

12
Piyush Mattoo

J'aime quelques utilisations de Java enum:

  1. .name () vous permet d'extraire le nom de l'énumération sous forme de chaîne.
  2. .ordinal () vous permet d’obtenir la 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, basculer activé.

enum avec 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); 
        ...
    }

commutateur exemple:

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

Cela devrait fonctionner de la manière que vous décrivez. Quelle erreur obtenez vous? Si vous pouviez coller votre code avec Pastebin, cela aiderait.

http://download.Oracle.com/javase/tutorial/Java/javaOO/enum.html

EDIT: Êtes-vous sûr de vouloir définir une énumération statique? Cela ne me semble pas correct. Une énumération ressemble beaucoup à tout autre objet. Si votre code est compilé et exécuté mais donne des résultats incorrects, ce serait probablement pour cette raison.

3
SystemParadox

Exemple de fonction associative court:

public String getIcon(TipoNotificacao tipo)
{
    switch (tipo){
        case Comentou : return "fa fa-comments";
        case ConviteEnviou : return "icon-envelope";
        case ConviteAceitou : return "fa fa-bolt";
        default: return "";
    }
}

Comme @Dhanushka l'a dit, omettre le qualificatif dans "switch" est la clé.

2
Auston
enumerations accessing is very simple in switch case

private TYPE currentView;

//declaration of enum 
public enum TYPE {
        FIRST, SECOND, THIRD
    };

//handling in switch case
switch (getCurrentView())
        {
        case FIRST:
            break;
        case SECOND:
            break;
        case THIRD:
            break;
        }

//getter and setter of the enum
public void setCurrentView(TYPE currentView) {
        this.currentView = currentView;
    }

    public TYPE getCurrentView() {
        return currentView;
    }

//usage of setting the enum 
setCurrentView(TYPE.FIRST);

avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always
2
Jaya

Je le fais comme

public enum State
{
    // Retrieving, // the MediaRetriever is retrieving music //
    Stopped, // media player is stopped and not prepared to play
    Preparing, // media player is preparing...
    Playing, // playback active (media player ready!). (but the media player
                // may actually be
                // paused in this state if we don't have audio focus. But we
                // stay in this state
                // so that we know we have to resume playback once we get
                // focus back)
    Paused; // playback paused (media player ready!)

    //public final static State[] vals = State.values();//copy the values(), calling values() clones the array

};

public State getState()
{
        return mState;   
}

Et utiliser dans la déclaration de commutateur

switch (mService.getState())
{
case Stopped:
case Paused:

    playPause.setBackgroundResource(R.drawable.selplay);
    break;

case Preparing:
case Playing:

    playPause.setBackgroundResource(R.drawable.selpause);
    break;    
}
1
Xar E Ahmer