假设我有一个简单的注释:
@MyAnnotation(value=<SomeString>)
和枚举:
enum Days {
MONDAY...
}
我不能使用这样的注释:
@MyAnnotation(value=Days.MONDAY.name())
private class SomeClass {
//some code
}
此代码将失败,说“它必须是编译时间常量”。我明白为什么会发生这种情况,并且我知道有关编译时间常量的JSL部分。
我的问题是为什么以及背后的原因根据规范不使枚举成为编译时间常数。这不像你可以改变枚举名称......
为Kumar编辑
private static final class Test {
public static final String complete = "start" + "finish";
}
答案 0 :(得分:2)
Method dispatching cannot be computed to a compile time constant
对于上面的例子,我给出了一个例子,因为在switch语句中的情况也需要编译时间常量
public class Joshua{
public final String complete = "start" + "finish";
public void check(String argument) {
switch(argument)
{
case complete: //This compiles properly
}
switch(argument)
{
case name(): //This doesn't compile
}
}
public final String name(){
return complete;
}
}
使用最终变量,你知道它是一个编译时常量但是方法可以自由地返回任何东西(最终方法根本无法覆盖)