我想使用一个java switch
语句,它使用class
名称作为case
常量.有可能吗?或者我是否必须复制类名?
由于编译器错误,以下代码不起作用:
case表达式必须是常量表达式
String tableName = "MyClass1"; ... switch (tableName) { case MyClass1.class.getSimpleName(): return 1; case MyClass2.class.getSimpleName(): return 2; default: return Integer.MAX_VALUE; }
以下是该问题的在线演示(openjdk 1.8.0_45
):http://goo.gl/KvsR6u
编译器错误已经说明了.案例标签必须是常量表达式,类文字和调用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; }
这记录了与读者的关系,但工具仍然不能确保实际的字符串内容与类名匹配.但是,根据您想要实现的目标,现在可能变得无关紧要,字符串内容是否与类名相匹配......
为什么不将映射存储在地图中而不是使用开关?
创建String to Integer的映射,并将所有类名映射到它们的返回值.
在请求中,如果条目不存在,则返回默认值.否则,返回地图中的值.