Java 在需要字符串的批注中使用的枚举值

Java 在需要字符串的批注中使用的枚举值,java,enums,annotations,Java,Enums,Annotations,假设我有一个简单的注释: @MyAnnotation(value=<SomeString>) 我不能像这样使用此批注: @MyAnnotation(value=Days.MONDAY.name()) private class SomeClass { //some code } 这段代码将失败,说明“它必须是一个编译过的时间常数”。我确实理解为什么会发生这种情况,并且我知道JSL部分关于编译的时间常数 我的问题是为什么不根据规范将枚举设置为编译后的时间常数,

假设我有一个简单的注释:

 @MyAnnotation(value=<SomeString>)
我不能像这样使用此批注:

 @MyAnnotation(value=Days.MONDAY.name())
 private class SomeClass {
       //some code
 }
这段代码将失败,说明“它必须是一个编译过的时间常数”。我确实理解为什么会发生这种情况,并且我知道JSL部分关于编译的时间常数

我的问题是为什么不根据规范将枚举设置为编译后的时间常数,原因是什么。您不能更改枚举名称

为Kumar编辑

private static final class Test {

    public static final String complete = "start" + "finish";

}
对于上面的例子,我举了一个例子,switch语句中的case也需要编译时常量

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;
    }

}

对于final变量,您知道它是一个编译时常量,但方法可以自由返回任何内容(final方法不能被重写)

编译器不能简单地执行name()方法来知道值编辑打算显示什么
complete
不是编译时常量,因此不能与注释值一起使用。@LukeWoodward你是对的,复制粘贴错误,我的错误。我想证明你仍然可以表演一些computation@KumarAbhinav是的,但枚举是显而易见的选择,因为它们无法更改。这可能与以下事实有关:JVM将枚举编译为类,而方法调度不能计算为编译时常量…@KumarAbhinav:我写这条评论时不是这样的。查看编辑历史。检查我的编辑,它与“一些计算”无关。另外,请阅读JLS中关于编译时常数的部分。我接受并投票支持您的时间,但这并不是我所期望的。。反正是Thx。@Eugene I无法表达“方法调度不能计算为编译时常量”这句话。所以你应该it@Eugene我想你应该看到这个链接@Eugene它只是一个固定常数的例子,但不属于“编译时常数”的定义
Method dispatching cannot be computed to a compile time constant
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;
    }

}