引用值在注释中的枚举中?

时间:2014-01-27 08:04:01

标签: java enums java-ee-7

我已经编写了自定义注释,如果按照以下方式使用它,工作正常。

@MyAnnotation("sun")
public void getResult(String id){


}

MyAnnotation.java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String value();

}

上面的代码工作正常。现在我不想硬编码“太阳”,而是将它保存在Enum中,如下所示。

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的值必须是常量表达式。我在这里做错了吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

更改自:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String value();

}

要:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    WeekDay value();

}

并像这样使用它:

@MyAnnotation(WeekDay.SUNDAY)

如果将字符串文字传递给当前注释,它也会起作用。将方法标记为final将不起作用,因为final on methods仅阻止您覆盖它,而不是返回常量值。 例如:

public final String getString() {
  String[] strings = { "A", "B" };
  return strings[new Random().nextInt(2)]; // returned value is not the same
}

答案 1 :(得分:0)

在编译时评估和设置所有注释属性。方法getDay()显然必须等到代码实际运行才能返回一个值,所以在编译期间你不能用它来设置东西!

您可以将注释值的类型更改为枚举,然后根据需要提供枚举。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
  Weekday value();
}

@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){
}

但如果它意味着接受更广泛的价值观,那可能没有任何意义。

答案 2 :(得分:0)

它无效。您可以在此答案中看到解释:https://stackoverflow.com/a/3272859/1912167

但是,您可以将注释定义为仅接受枚举:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    WeekDay value();

}

@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){


}