我有一个类为我的应用程序声明常量
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)
那不行.问题是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.
尝试GroupConstants.在case语句中删除前缀。出于我完全不清楚的原因,如果前缀为类名,则它不接受相同的常量。
所以代替
case GroupConstants.STRING_VALUE:
Run Code Online (Sandbox Code Playgroud)
请试试:
case STRING_VALUE:
Run Code Online (Sandbox Code Playgroud)
您可能需要静态导入才能进行编译。
| 归档时间: |
|
| 查看次数: |
27020 次 |
| 最近记录: |