Ошибка компилятора уже говорит об этом. Метки case должны быть постоянными выражениями, и ни слова, ни литералы класса, ни результат вызова на них не являются постоянными выражениями.
Рабочий раствор будет:
String tableName = "MyClass1";
...
switch (tableName) {
case "MyClass1":
return 1;
case "MyClass2":
return 2;
default:
return Integer.MAX_VALUE;
}
Выражение MyClass1.class.getSimpleName()
не проще, чем "MyClass1"
, но, конечно, не будет никакой проверки во время компиляции, совпадают ли имена существующих классов и инструменты рефакторинга или обфускаторы не замечают отношения между классом MyClass1
и строковым литералом "MyClass1"
.
Нет решения. Единственное, что вы можете сделать, чтобы уменьшить проблему, - объявить ключи внутри связанного класса для документирования отношений, например.
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;
}
Это документирует отношение к читателю, но инструменты все еще не гарантируют, что фактическое содержимое строки соответствует имени класса. Однако в зависимости от того, чего вы хотите достичь, теперь может быть неактуальным, соответствует ли содержимое строки имени класса ...
Можете ли вы попробовать назначить строки конечным локальным переменным String? –
Какая версия java? Вы получите разные результаты на Java 7/8. – Marged
@Marged Я использую Java 8, но интересуюсь решением для любой версии ... – dedek