是否可以在 java switch/case 语句中使用 class 名称?
Is it possible use a class name in java switch/case statement?
我想使用 java switch
语句,它使用 class
名称作为 case
常量。有可能吗?还是我必须复制 class 个名称?
由于编译器错误,以下代码无法运行:
case expressions must be constant expressions
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
为什么不使用 switch,而是将映射存储在映射中?
创建一个字符串到整数的映射,并将所有 class 名称映射到它们的 return 值。
根据请求,如果条目不存在,return 默认值。否则,return 地图中的值。
为什么不使用 If..Else 而不是 Switch..case。应该适用于 java 的所有版本,直到我知道。
if (tableName.equals(MyClass1.class.getSimpleName())) {
return 1;
} else if (tableName.equals(MyClass2.class.getSimpleName())) {
return 2;
} else {
return Integer.MAX_VALUE;
}
编译器错误已经说明了。 case 标签必须是常量表达式,class 文字和调用 getSimpleName()
的结果都不是常量表达式。
可行的解决方案是:
String tableName = "MyClass1";
...
switch (tableName) {
case "MyClass1":
return 1;
case "MyClass2":
return 2;
default:
return Integer.MAX_VALUE;
}
表达式MyClass1.class.getSimpleName()
并不比"MyClass1"
简单,但是,当然不会有任何compile-time检查名称是否匹配现有的classes并且重构工具或混淆器不会注意到 class MyClass1
和字符串文字 "MyClass1"
.
之间的关系
没有解决办法。唯一可以减少问题的方法是在关联的 class 中声明键以记录关系,例如
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;
}
这记录了与 reader 的关系,但工具仍然无法确保实际字符串内容与 class 名称匹配。但是,根据您想要实现的目标,现在可能变得无关紧要,字符串内容是否与 class 名称匹配...
我想使用 java switch
语句,它使用 class
名称作为 case
常量。有可能吗?还是我必须复制 class 个名称?
由于编译器错误,以下代码无法运行:
case expressions must be constant expressions
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
为什么不使用 switch,而是将映射存储在映射中?
创建一个字符串到整数的映射,并将所有 class 名称映射到它们的 return 值。
根据请求,如果条目不存在,return 默认值。否则,return 地图中的值。
为什么不使用 If..Else 而不是 Switch..case。应该适用于 java 的所有版本,直到我知道。
if (tableName.equals(MyClass1.class.getSimpleName())) {
return 1;
} else if (tableName.equals(MyClass2.class.getSimpleName())) {
return 2;
} else {
return Integer.MAX_VALUE;
}
编译器错误已经说明了。 case 标签必须是常量表达式,class 文字和调用 getSimpleName()
的结果都不是常量表达式。
可行的解决方案是:
String tableName = "MyClass1";
...
switch (tableName) {
case "MyClass1":
return 1;
case "MyClass2":
return 2;
default:
return Integer.MAX_VALUE;
}
表达式MyClass1.class.getSimpleName()
并不比"MyClass1"
简单,但是,当然不会有任何compile-time检查名称是否匹配现有的classes并且重构工具或混淆器不会注意到 class MyClass1
和字符串文字 "MyClass1"
.
没有解决办法。唯一可以减少问题的方法是在关联的 class 中声明键以记录关系,例如
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;
}
这记录了与 reader 的关系,但工具仍然无法确保实际字符串内容与 class 名称匹配。但是,根据您想要实现的目标,现在可能变得无关紧要,字符串内容是否与 class 名称匹配...