Java枚举:重构开关语句';需要常量表达式';编译错误?
我有一个类为我的应用程序声明常量Java枚举:重构开关语句';需要常量表达式';编译错误?,java,Java,我有一个类为我的应用程序声明常量 public class GroupConstants { .. public static final int INTEGER_VALUE = 1; public static final int LONG_VALUE = 2; public static final int STRING_VALUE = 3; .. } 代码中有一组switch语句 private static Object getValue(Str
public class GroupConstants {
..
public static final int INTEGER_VALUE = 1;
public static final int LONG_VALUE = 2;
public static final int STRING_VALUE = 3;
..
}
代码中有一组switch语句
private static Object getValue(String stringValue, Parameter parameter) throws InvalidPatternException
{
Object result=null;
switch (parameter.getDataType())
{
case GroupConstants.STRING_VALUE: // String value
result=stringValue;
break;
case GroupConstants.INTEGER_VALUE: // Long value
case GroupConstants.LONG_VALUE:
case GroupConstants.BOOLEAN_VALUE:
case GroupConstants.DATE_VALUE:
..
}
我想重构由枚举表示的int常量值
public enum DataType {
UNKNOWN_VALUE(0,"unknown"),
INTEGER_VALUE(1,"integer"),
LONG_VALUE(2,"long"),
STRING_VALUE(3,"string"),
BOOLEAN_VALUE(4,"boolean"),
..
}
所以我的代码可能是这样的
@Deprecated
public static final int INTEGER_VALUE = DataType.INTEGER_VALUE.getId();
我可以更改我的switch语句。当我将静态final int引用更改为指向enum时,所有switch语句都会中断
[javac] /home/assure/projects/tp/main/src/a/b/c/DDDDDManagerBean.java:1108: constant expression required
[javac] case GroupConstants.INTEGER_VALUE:
[javac] ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:203: constant expression required
[javac] case GroupConstants.INTEGER_VALUE:
[javac] ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:268: constant expression required
[javac] case GroupConstants.INTEGER_VALUE:
[javac] ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:316: constant expression required
[javac] case GroupConstants.INTEGER_VALUE:
[javac] ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:436: constant expression required
[javac] case GroupConstants.INTEGER_VALUE:
我还不想被迫改变所有的开关,所以有一个干净的解决办法吗?那是行不通的。问题是
getId()
调用意味着根据JLS,常量的值表达式不是编译时常量表达式。有关详细信息,请参阅,您将看到常量表达式中不允许方法调用
除了对所有switch语句进行大规模更改之外,我认为没有任何解决方法。但我不担心。IDE应该能够帮助您找到并替换所有出现的旧常量
跟进
您评论中的以下代码也不起作用:
private int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId();
public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER;
首先,INTEGER\u VALUE\u HOLDER
不是中定义的“常量变量”。因此,整数值也不是
其次,static的初始值设定项表达式不能引用this
,INTEGER\u VALUE\u HOLDER
实际上是this.INTEGER\u VALUE\u HOLDER的另一种说法,它不起作用。问题是getId()
调用意味着根据JLS,常量的值表达式不是编译时常量表达式。有关详细信息,请参阅,您将看到常量表达式中不允许方法调用
除了对所有switch语句进行大规模更改之外,我认为没有任何解决方法。但我不担心。IDE应该能够帮助您找到并替换所有出现的旧常量
跟进
您评论中的以下代码也不起作用:
private int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId();
public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER;
首先,INTEGER\u VALUE\u HOLDER
不是中定义的“常量变量”。因此,整数值也不是
其次,static的初始值设定项表达式不能引用this
,INTEGER\u VALUE\u HOLDER
实际上是另一种说法。在你的情况下,你应该说:
DataType type = ...;
switch (type) {
case UNKNOWN_VALUE
//do something
break;
case INTEGER_VALUE
//do something
break;
case LONG_VALUE
//do something
break;
case STRING_VALUE
//do something
break;
case BOOLEAN_VALUE
//do something
break;
Java本机支持switch语句中的枚举。在你的情况下,你应该说:
DataType type = ...;
switch (type) {
case UNKNOWN_VALUE
//do something
break;
case INTEGER_VALUE
//do something
break;
case LONG_VALUE
//do something
break;
case STRING_VALUE
//do something
break;
case BOOLEAN_VALUE
//do something
break;
尝试去掉case语句中的
GroupConstants.
前缀。由于我完全不清楚的原因,如果它的前缀是类名,它就不接受相同的常量
所以不是
case GroupConstants.STRING_VALUE:
请尝试:
case STRING_VALUE:
您可能需要一个静态导入来编译它。尝试去掉case语句中的
GroupConstants.
前缀。由于我完全不清楚的原因,如果它的前缀是类名,它就不接受相同的常量
所以不是
case GroupConstants.STRING_VALUE:
请尝试:
case STRING_VALUE:
您可能需要一个静态导入来编译它。在eclipse IDE中很简单,在switch语句中CTRL+1和convert switch语句-if else语句中,在eclipse IDE中很简单,在switch语句中CTRL+1和convert switch语句-if else语句中补充AlexR的答案,转换字符串以获得枚举:
DataType type = Datatype.valueOf(enumName);
switch (type) {
case UNKNOWN_VALUE
//do something
break;
...
补充AlexR的答案,将字符串转换为枚举:
DataType type = Datatype.valueOf(enumName);
switch (type) {
case UNKNOWN_VALUE
//do something
break;
...
你的团队不是老样子吗?是否应该是case DataType.INTEGER\u VALUE:这应该在编译器错误中?根据您到目前为止显示的内容,我看不出问题出在哪里;这应该基于我假设您在中所做的工作,例如,
ParameterComponent
。但是,同样,错误消息与新的数据类型
类无关,因此可能是我误传了导致编译错误的代码。您是否可以粘贴一些未编译的代码(例如ParameterComponent类),并突出显示错误发生的位置?GroupConstants不是旧方法吗?是否应该是case DataType.INTEGER\u VALUE:这应该在编译器错误中?根据您到目前为止显示的内容,我看不出问题出在哪里;这应该基于我假设您在中所做的工作,例如,ParameterComponent
。但是,同样,错误消息与新的数据类型
类无关,因此可能是我误传了导致编译错误的代码。你能粘贴一点未编译的代码(例如ParameterComponent类)并突出显示错误发生的位置吗?正确的解决方法是:private int INTEGER_VALUE_HOLDER=DataType.INTEGER_VALUE.getId();公共静态最终整型整数值=整型整数值持有人;但是它违背了重构的目的,正确的解决方法是:private int INTEGER_VALUE_HOLDER=DataType.INTEGER_VALUE.getId();公共静态最终整型整数值=整型整数值持有人;但是它违背了重构的目的。关于使用Enum驱动switch语句,您的看法是正确的。在我的例子中,数据类型代表一个对象类型,因此,我计划创建一个接口,并将case语句中的逻辑移动到对象,从而允许be从代码中删除switch语句,而不是重构开关以使用Enum。关于使用Enum驱动switch语句,您的看法正确。在我的例子中,数据类型代表一个对象类型,因此我计划创建一个接口,并将case语句中的逻辑移动到对象,从而允许be从代码中删除switch语句,而不是重构开关以使用Enum。这有什么关系?switch语句中已经允许使用枚举。您需要什么