java - 将 Enum 与 switch 语句一起使用:需要常量表达式错误
问题描述
我定义了一个枚举类“TestEnvEnum”,并定义了一个调用枚举类的类“ConfigInit”。
public enum TestEnvEnum {
ENV1("devEnv1"),
ENV2("devEnv2"),
ENV3("devEnv3");
private final String name;
TestEnvEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
public class ConfigInit {
static String envIndex = "1";
static String envProps = System.getProperties().getProperty("env");
public static void scfInit() {
switch (envProps) {
case TestEnvEnum.ENV2.name(): //error: Constant expression required
envIndex = "2";
break;
case TestEnvEnum.ENV3.name(): //error: Constant expression required
envIndex = "3";
break;
default:
envIndex = "1";
}
}
}
问题:如果我使用 Enum,那么 case TestEnvEnum.ENV2.name() 和 case TestEnvEnum.ENV3.name() 会提示“需要常量表达式”。
如果我将它们更改为“devEnv2”和“devEnv3”,程序将正确运行。
我想知道我应该如何在我的程序中使用 Enum 来避免这样的错误。请帮助我。
解决方案
你可以把它改成这样:
public enum TestEnvEnum {
ENV1("devEnv1"),
ENV2("devEnv2"),
ENV3("devEnv3");
private final String name;
TestEnvEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
public static TestEnvEnum byName(String name) { //You may change the return type to Optional<TestEnvEnum> to avoid NPE
for (TestEnvEnum value : values()) {
if(value.getName().equals(name)) { //equalsIgnoreCase should be used if you don't care about the capitalization
return value;
}
}
return null;
}
}
public class ConfigInit {
static String envIndex = "1";
static String envProps = System.getProperties().getProperty("env");
public static void scfInit() {
TestEnvEnum testEnvEnum = TestEnvEnum.byName(envProps);
switch (testEnvEnum) {
case ENV2:
envIndex = "2";
break;
case ENV3:
envIndex = "3";
break;
default:
envIndex = "1";
}
}
}
我建议您在这里阅读这篇文章,它很好地解释了为什么会发生这种情况。
推荐阅读
- ios - 在 Swift 中尝试将单元格分配给 UICollectionView 中的某些部分时,如何遍历数组?
- javascript - 如何使用 JavaScript 禁用 Evernote 网页视图“最大宽度”?
- html - 在我的本地机器上创建一个网页。链接转到 file:/// 而不是 http://
- javascript - 无法重定向到另一个 HTML 页面
- node.js - 会话结束后从用户浏览器中删除 cookie。我使用 Passport-twitter 对用户进行身份验证。
- ios - 与委托传递数据但仍然为零,为什么?
- html - 如何提升一组卡片css中的单张卡片
- composer-php - PhpOffice/PhpSpreadsheet “类 PhpOffice\PhpSpreadsheet\IOFactory 无法加载”
- angular6 - Apollo-boost 缓存问题
- node.js - 在 kubernetes 上以主机作为 localhost 公开节点 js 应用程序