Java 引用注释中枚举中的值?
我已经写了我的自定义注释,如果我按照下面的方式使用它,它工作得很好Java 引用注释中枚举中的值?,java,enums,java-ee-7,Java,Enums,Java Ee 7,我已经写了我的自定义注释,如果我按照下面的方式使用它,它工作得很好 @MyAnnotation("sun") public void getResult(String id){ } public enum WeekDay{ SUNDAY("sun"), MONDAY("mon"); private String day; WeekDay(String day) { this.day= day; } public String
@MyAnnotation("sun")
public void getResult(String id){
}
public enum WeekDay{
SUNDAY("sun"), MONDAY("mon");
private String day;
WeekDay(String day) {
this.day= day;
}
public String getDay() {
return this.day;
}
}
@MyAnnotation(WeekDay.SUNDAY.getDay())
public void getResult(String id){
}
MyAnnotation.java
以上代码运行良好。现在,我不想硬编码“sun”,而是将其保存在一个枚举中,如下所示
@MyAnnotation("sun")
public void getResult(String id){
}
public enum WeekDay{
SUNDAY("sun"), MONDAY("mon");
private String day;
WeekDay(String day) {
this.day= day;
}
public String getDay() {
return this.day;
}
}
@MyAnnotation(WeekDay.SUNDAY.getDay())
public void getResult(String id){
}
现在在注释中,我做如下操作
@MyAnnotation("sun")
public void getResult(String id){
}
public enum WeekDay{
SUNDAY("sun"), MONDAY("mon");
private String day;
WeekDay(String day) {
this.day= day;
}
public String getDay() {
return this.day;
}
}
@MyAnnotation(WeekDay.SUNDAY.getDay())
public void getResult(String id){
}
上面的代码给出了eclipse中的编译错误。它表示注释属性MyAnnotation.value的值必须是一个常量表达式。我做错什么了吗
谢谢 所有注释属性都是在编译时计算和设置的。方法getDay()显然必须等到代码实际运行后才能返回值,因此在编译过程中不能使用它来设置 您可以将注释值的类型更改为枚举,然后根据需要提供枚举
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
Weekday value();
}
@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){
}
但是,如果这意味着要接受更广泛的价值观,那么这可能没有任何意义。这是行不通的。您可以在这个答案中看到一个解释: 但是,可以将注释定义为仅接受枚举:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
WeekDay value();
}
@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){
}
更改为:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
致:
然后像这样使用它:
@MyAnnotation(WeekDay.SUNDAY)
如果将字符串文本传递给当前注释,它也会起作用。将方法标记为final将不起作用,因为final on方法只会阻止您重写它,而不会返回常量值。
例如:
你能给我们看一下注释代码吗?还有,你试过没有.getDay()的WeekDay.SUNDAY吗?Silviu,我编辑了我的问题。我试过你的建议,它说不能从工作日转换为字符串。也许声明getDay()方法是最终的?Jorge,我试过了。还是一样的问题。@Jorge_B检查我的答案,看看为什么它不能在getDay()上与final一起工作