web-dev-qa-db-fra.com

Java: utilisation de l'instruction switch avec enum sous sous-classe

Je vais d’abord préciser que je suis beaucoup plus familiarisé avec les énumérations en C # et qu’il me semble que les énumérations en Java sont plutôt désordonnées.

Comme vous pouvez le constater, j’essaie d’utiliser une instruction switch @ enums dans mon exemple suivant, mais j’obtiens toujours une erreur, peu importe ce que je fais.

L'erreur que je reçois est:

L'étiquette de cas qualifiée SomeClass.AnotherClass.MyEnum.VALUE_A doit être remplacée par la constante d'énumération non qualifiée VALUE_A

Le problème, c’est que je tout à fait comprends l’erreur, mais je ne peux pas écrire VALUE_A puisque l’énumération est située dans une autre sous-classe. Y a-t-il un moyen de résoudre ce problème? Et pourquoi cela se passe-t-il en Java?

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        MyEnum enumExample //...

        switch (enumExample) {
            case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
                //..
                break;
            }
        }
    }
}
207
Popokoko

Changez-le en ceci:

switch (enumExample) {
    case VALUE_A: {
        //..
        break;
    }
}

L'indice est dans l'erreur. Vous n'avez pas besoin de qualifier les étiquettes case avec le type enum, mais simplement sa valeur.

454
darrengorman

Java déduit automatiquement le type des éléments dans case, les étiquettes ne doivent donc pas être qualifiées.

int i;
switch(i) {
   case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
   case VALUE_A: // <- an element of the enumeration is expected
}
28
Kru

cela devrait faire:

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //...

        switch (enumExample) {
            case VALUE_A: { //<-- error on this line
            //..
            break;
            }
        }
    }
}
2
Woyzeck

Faux:

case AnotherClass.MyEnum.VALUE_A

Droite:

case VALUE_A:
1
Akash Yellappa

C'est comme ça que je l'utilise. Et cela fonctionne à merveille -

public enum Button {
        REPORT_ISSUES(0),
        CANCEL_ORDER(1),
        RETURN_ORDER(2);

        private int value;

        Button(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

Et le switch-case comme indiqué ci-dessous

@Override
public void onClick(MyOrderDetailDelgate.Button button, int position) {
    switch (button) {
        case REPORT_ISSUES: {
            break;
        }
        case CANCEL_ORDER: {
            break;
        }
        case RETURN_ORDER: {
            break;
        }
    }
}
0
Jimit Patel

Écrivez someMethod() de cette manière:

public void someMethod() {

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A;

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

Dans l'instruction switch, vous devez utiliser le nom de la constante uniquement.

0
dash1e