Java switch : case 表达式必须是常量表达式

Java switch : case expressions must be constant expressions

我的学校项目中的 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 statements can only take compile-time constants, or enums" 和我的常量值是从外部 属性 文件中获取的,所以我认为这就是发生这个错误的原因,但是通过外部文件配置这个常量是完成我的项目的必要条件:( 除了不舒服的 if-else 重新编码这部分 od 源之外,还有什么解决方案吗?

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

g这里的典型方法是使用某种类型的 map/dictionary 将您的输入 "keys"(在您的情况下为 portNumbers[i])映射到他们的 "value"(例如映射HTTP 到 "http").

你可以

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

并使用

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