编译器错误已经说明了。case 标签必须是常量表达式,类文字和调用getSimpleName()
它们的结果都不是常量表达式。
一个可行的解决方案是:
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;
}
这记录了与读者的关系,但工具仍然不能确保实际的字符串内容与类名匹配。但是,取决于您想要实现的目标,现在可能变得无关紧要,字符串内容是否与类名匹配......</p>