Java开关:case表达式必须是常量表达式

时间:2015-03-15 15:12:51

标签: java switch-statement

我的学校项目中的java开关有问题:在代码中,案例中的所有常量都加下划线红色并抛出该案例错误

private static final int TCP = Integer.parseInt(PropertiesComunicator.getData("tcp"));
private static final int HTTP = Integer.parseInt(PropertiesComunicator.getData("http"));
private static final int HTTPS = Integer.parseInt(PropertiesComunicator.getData("https"));
private static final int TELNET = Integer.parseInt(PropertiesComunicator.getData("telnet"));
private static final int SSH = Integer.parseInt(PropertiesComunicator.getData("ssh"));
private static final int FTP_DATA = Integer.parseInt(PropertiesComunicator.getData("ftp-data"));
private static final int FTP_CONTROL = Integer.parseInt(PropertiesComunicator.getData("ftp-control"));

switch (portNumbers[i]) {

        case HTTP: 
                    portNames[i] = "http";
                    break;

        case HTTPS:
                    portNames[i] = "https";
                    break;

        case TELNET:
                    portNames[i] = "telnet";
                    break;

        case SSH: 
                    portNames[i] = "ssh";
                    break;

        case FTP_DATA:
                    portNames[i] = "ftp-data";
                    break;

        case FTP_CONTROL:
                    portNames[i] = "ftp-control";
                    break;

        default:
                    portNames[i] = null;
                    break;
        }

在互联网上快速研究后,我发现这个错误是因为“case语句只能采用编译时常量或枚举”,而我的常量值取自extern属性文件所以我认为这就是为什么这个错误发生,但extern文件配置这个常量是完成我的项目的必要条件:(有没有任何解决方案除了不舒服if-else重新编码这部分od源?

P.S。这几个端口不是我唯一要分析的......

1 个答案:

答案 0 :(得分:0)

这里的典型方法是使用某种类型的map / dictionary来将输入“keys”(在你的情况下,portNumbers[i])映射到它们的“值”(例如将HTTP映射到“http”)。 / p>

你可以做到

Map<Integer, String> protos = new HashMap<Integer, String>();
protos.put(HTTP, "http");

并使用

解决所有问题
portNames[i] = protos.get(portNumber[i]);