我有一个类声明我的应用程序的常量
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();
加班我可以改变我的开关语句。当我将静态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:
我不想被迫改变所有的开关,所以它有一个干净的工作?
答案 0 :(得分: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;
答案 1 :(得分:8)
那不会奏效。问题是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;
首先,INTEGER_VALUE_HOLDER
不是&#34;常量变量&#34;根据{{3}}中的定义。因此INTEGER_VALUE
也不是。{/ p>
其次,静态的初始化表达式不能引用this
,而INTEGER_VALUE_HOLDER
实际上是this.INTEGER_VALUE_HOLDER
的另一种说法。
答案 2 :(得分:4)
尝试在case语句中删除GroupConstants.
前缀。由于我完全不清楚的原因,如果它以类名为前缀,则它不接受相同的常量。
所以而不是
case GroupConstants.STRING_VALUE:
请尝试:
case STRING_VALUE:
您可能需要静态导入才能进行编译。
答案 3 :(得分:1)
很简单,在切换句子CTRL + 1和转换切换句子 - if-else句子http://tools.android.com/tips/non-constant-fields
答案 4 :(得分:0)
补充 AlexR 的答案,将字符串转换为枚举:
DataType type = Datatype.valueOf(enumName);
switch (type) {
case UNKNOWN_VALUE
//do something
break;
...