/ / Dlaczego otrzymuję stałe odniesienie Enum nie może być zakwalifikowane na etykiecie sprawy? - java, enums

Dlaczego otrzymuję stałe odniesienie do Enum nie może być zakwalifikowane w etykiecie sprawy? - Jawa, wylicza

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 № 1

Ma 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żdego casei żadne dwie takie stałe wartości mogą być takie same. Kompilator sprawdza zduplikowane wartości stałe w a switch 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.