Najpierw stwierdzę, że znacznie lepiej znam wyliczenia w języku C # i wygląda na to, że wyliczenia w języku Java są dość nieporządne.
Jak widać, próbuję użyć instrukcji switch @ enums w następnym przykładzie, ale zawsze otrzymuję błąd bez względu na to, co robię.
Błąd, który otrzymuję to:
Etykietę kwalifikowanego przypadku
SomeClass.AnotherClass.MyEnum.VALUE_A
należy zastąpić niekwalifikowaną stałą wyliczaniaVALUE_A
Chodzi o to, że całkiem rozumiem błąd, ale nie mogę po prostu napisać WARTOŚCI_A, ponieważ wyliczenie znajduje się w innej podklasie. Czy istnieje sposób na rozwiązanie tego problemu? I dlaczego tak się dzieje w Javie?
//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;
}
}
}
}
java
enums
switch-statement
Popokoko
źródło
źródło
Enum
jest bardzo przydatna, gdy się ich zrozumie - wcale nie jest bałagan. Są one znacznie bardziej elastyczne i praktyczne niż proste wyliczenia (tylko wartość oznaczona liczbą całkowitą), jak widać na innych platformach. Zobacz samouczek Oracle . Odkryj zoptymalizowaneSet
/Map
wdrożenia:EnumSet
iEnumMap
.Odpowiedzi:
Zmień to na:
Wskazówka tkwi w błędzie. Nie musisz kwalifikować
case
etykiet typu wyliczeniowego, tylko jego wartość.źródło
Java automatycznie określa typ elementów
case
, więc etykiety muszą być niekwalifikowane.źródło
MyEnum
co nie ma sensu.static final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;}
Zamiastcase 7
. To ograniczenie dla wyliczeń nie ma sensu (mogę używać nie tylko podstawowych literałów, ale także ręcznie zdefiniowanych stałych dlaswitch
wyrażenia liczb całkowitych , ale nie mogę używać ręcznie zdefiniowanych stałych, ale tylko podstawowych nazw dla wyliczeń).powinno to zrobić:
źródło
Źle:
Dobrze:
źródło
Tak to wykorzystuję. I działa fantastycznie -
I
switch-case
jak pokazano poniżejźródło
Napisz
someMethod()
w ten sposób:W instrukcji switch musisz używać tylko stałej nazwy.
źródło