Dlaczego poniższy kod się nie kompiluje, zmieniając instrukcję case na
case ENUM1: doSomeStuff();
Prace?
public enum EnumType
{
ENUM1, ENUM2, ENUM3;
void doSomeStuff()
{
switch(this)
{
case EnumType.ENUM1: doSomeStuff();
}
}
}
Odpowiedzi:
33 dla odpowiedzi № 1Ma to na celu uniknięcie możliwości porównania z różnymi typami wyliczeń. Sensowne jest ograniczenie tego do jeden typ, tj. typ wartości wyliczonej w switch
komunikat.
Aktualizacja: w rzeczywistości ma zachować zgodność binarną. Oto cytat z około połowy rozdział 13.4.9 JLS:
Jednym z powodów wymagających wstawiania stałych jest to
switch
instrukcje wymagają stałych dla każdegocase
i żadne dwie takie stałe wartości mogą być takie same. Kompilator sprawdza zduplikowane wartości stałe w aswitch
instrukcja w czasie kompilacji;class
format pliku nie łączy symbolicznie wartości wielkości liter.
Innymi słowy, z powodu identyfikatora klasy w EnumType.ENUM1
, nie może być reprezentowane jako wyrażenie stałe podczas kompilacji, podczas gdy jest wymagane przez switch
komunikat.
27 dla odpowiedzi nr 2
To nie jest tak naprawdę odpowiedź na twoje pytanie, ale jeśli masz kod w zależności od wartości wyliczenia, możesz również utworzyć w wyliczeniu abstrakcyjną metodę, która zostanie przeciążona dla każdej wartości:
public enum EnumType {
ENUM1 {
@Override
public void doSomeStuff() {
// do something
}
},
ENUM2 {
@Override
public void doSomeStuff() {
// do something else
}
};
public abstract void doSomeStuff();
}
20 dla odpowiedzi nr 3
Ponieważ włączasz obiekt typu EnumType
a jedynymi możliwymi wartościami są stałe wyliczeniowe, nie ma potrzeby ponownego kwalifikowania tych stałych w przełączniku. W końcu byłoby nielegalne case OtherEnumType.ENUM1:
w każdym razie w tym.