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语句中已经允许使用枚举。您需要什么