是否可以在 java switch/case 语句中使用类名?

我想使用java语句,它使用名称作为常量。有可能吗?还是我必须复制类名?switchclasscase

由于编译器错误,以下代码不起作用:

事例表达式必须是常量表达式

String tableName = "MyClass1";

...

switch (tableName) {
case MyClass1.class.getSimpleName():
    return 1;
case MyClass2.class.getSimpleName():
    return 2;
default:
    return Integer.MAX_VALUE;
}

以下是该问题的在线演示():http://goo.gl/KvsR6uopenjdk 1.8.0_45


答案 1

编译器错误已经说过了。事例标签必须是常量表达式,类文本和调用它们的结果都不是常量表达式。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;
}

这会记录与读取器的关系,但工具仍无法确保实际的字符串内容与类名匹配。但是,根据您要实现的目标,字符串内容是否与类名匹配,现在可能会变得无关紧要...


答案 2

为什么不将映射存储在映射中,而不是使用开关呢?

创建字符串到整数的映射,并将所有类名映射到其返回值。

在请求中,如果该条目不存在,则返回默认值。否则,返回映射中的值。


推荐