我有一个类为我的应用程序声明常量
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/