Java枚举: Refactoring switch statements 'constant expression required' compile error?

标签 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(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 语句。当我更改 static Final int 引用以指向枚举时,我的所有 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 规定的编译时常量表达式。引用JLS 15.28 Constant Expressions了解详细信息,您将看到常量表达式中不允许方法调用。

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

跟进

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

private int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId(); 
public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER;

首先,根据 JLS 4.12.4 Final Variables 中的定义,INTEGER_VALUE_HOLDER 不是“常量变量” 。因此 INTEGER_VALUE 都不是。

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

关于Java枚举: Refactoring switch statements 'constant expression required' compile error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59645627/

相关文章:

java - 如何安排任务以使其在android中的任何条件下执行

java - 使用采用可变数量参数的方法

java - Java 中的全局异常处理程序

java - 为什么构造函数的名称不能与类名不同,只要它们是唯一的

java - 为什么 ScheduledThreadPoolExecutor 的队列大小始终为 0?

Java JNA UCHAR 和 PUCHAR

java - 实例 "Main"从另一个类调用时方法未运行

java - 比较 2 个二维数组 - Java

java - 无法获取 <h :outputText value from Java class

java - 我正在寻找一个 switch 语句来根据用户按下的按钮添加不同的页面