Błąd kompilatora już to mówi. Etykiety case muszą być wyrażeniami stałymi, a ich znaki literowe ani wynik wywołania na nich nie są wyrażeniami stałymi.
roztworu roboczego byłoby:
String tableName = "MyClass1";
...
switch (tableName) {
case "MyClass1":
return 1;
case "MyClass2":
return 2;
default:
return Integer.MAX_VALUE;
}
Wyrażenie MyClass1.class.getSimpleName()
nie jest prostsze niż "MyClass1"
, ale, oczywiście, nie będzie żadnych check kompilacji czy nazwy odpowiadają istniejących klas i narzędzi Refaktoryzacja lub obfuscators nie zauważają związku między klasą MyClass1
a literałem tekstowym "MyClass1"
.
Nie ma na to rozwiązania. Jedyną rzeczą, którą możesz zrobić, aby zmniejszyć problem, jest zadeklarowanie kluczy w powiązanej klasie w celu udokumentowania relacji, np.
class MyClass1 {
static final String IDENTIFIER = "MyClass1";
...
}
class MyClass2 {
static final String IDENTIFIER = "MyClass2";
...
}
...
String tableName = MyClass1.IDENTIFIER;
...
switch (tableName) {
case MyClass1.IDENTIFIER:
return 1;
case MyClass2.IDENTIFIER:
return 2;
default:
return Integer.MAX_VALUE;
}
Dokumentuje związek z czytnikiem, ale narzędzia wciąż nie zapewniają, że rzeczywista zawartość ciągów pasuje do nazwy klasy. Jednak w zależności od tego, co chcesz osiągnąć, teraz może stać się nieistotne, czy zawartość ciągu pasuje do nazwy klasy ...
Czy możesz spróbować przypisać ciągi do końcowych zmiennych lokalnych String? –
Którą wersję Java? Otrzymasz różne wyniki na Java 7/8. – Marged
@ Maraton Używam Java 8, ale interesuje mnie rozwiązanie dla każdej wersji ... – dedek