当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以在javaswitch/case语句中使用类名?》经验,为你挑选了2个好方法。

我想使用一个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



1> Holger..:

编译器错误已经说明了.案例标签必须是常量表达式,类文字和调用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> Sam Sun..:

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

创建String to Integer的映射,并将所有类名映射到它们的返回值.

在请求中,如果条目不存在,则返回默认值.否则,返回地图中的值.


也许,但是你的代码也会变得不那么可读,因为你需要为每个类名称添加一行,然后为每种情况添加一些代码.你得到的几纳秒的优化可能永远不值得使用`Map`来获得代码的清晰度
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有