Java枚举:重构switch语句的常量表达式需要'编译错误?

eme*_*ava 17 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;
    ..
}
Run Code Online (Sandbox Code Playgroud)

在代码中有一组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:
..
}
Run Code Online (Sandbox Code Playgroud)

我想重构int常量值以由枚举表示

public enum DataType {

    UNKNOWN_VALUE(0,"unknown"),
    INTEGER_VALUE(1,"integer"),
    LONG_VALUE(2,"long"),
    STRING_VALUE(3,"string"),
    BOOLEAN_VALUE(4,"boolean"),
..
}
Run Code Online (Sandbox Code Playgroud)

所以我的代码可能看起来像这样

@Deprecated
public static final int INTEGER_VALUE = DataType.INTEGER_VALUE.getId();
Run Code Online (Sandbox Code Playgroud)

和加班我可以改变我的开关语句.当我将静态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:
Run Code Online (Sandbox Code Playgroud)

我不想被迫改变所有的开关,所以它有一个干净的工作?

Ale*_*exR 10

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;
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 9

那不行.问题是getId()调用意味着常量的值表达式不是根据JLS的编译时常量表达式.有关详细信息,请参阅JLS 15.28常量表达式,您将看到常量表达式中不允许进行方法调用.

除了对所有switch语句进行大规模更改之外,我认为没有任何解决方法.但我不担心.您的IDE应该能够帮助您查找和替换旧常量的所有实例.

跟进

您评论中的以下代码也不起作用:

private int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId(); 
public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER;
Run Code Online (Sandbox Code Playgroud)

首先,INTEGER_VALUE_HOLDER根据JLS 4.12.4最终变量中的定义,它不是"常数变量" .因此也不是INTEGER_VALUE.

其次,静态的初始化表达式不能引用this,而且INTEGER_VALUE_HOLDER实际上是另一种说法this.INTEGER_VALUE_HOLDER.


Grz*_*zki 5

尝试GroupConstants.在case语句中删除前缀。出于我完全不清楚的原因,如果前缀为类名,则它不接受相同的常量。

所以代替

 case GroupConstants.STRING_VALUE:
Run Code Online (Sandbox Code Playgroud)

请试试:

 case STRING_VALUE:
Run Code Online (Sandbox Code Playgroud)

您可能需要静态导入才能进行编译。