Java中的Typesafe枚举

时间:2010-08-04 13:31:08

标签: java enums annotations

不确定标题是否具有误导性,但要求如下。

我需要使用字符串值作为自定义注释的输入。使用枚举值时,IDE会给出

  

java属性值必须是常量。

@test("test") // works

@test(Const.myEnum.test.toString()) //java attribute value must be constant

我读到了字符串值不可变的重要性。是否有可能通过枚举(而不是公共静态最终String hack)。

感谢。

5 个答案:

答案 0 :(得分:6)

枚举可用于注释。你应该这样做:

@test(Const.myEnum.test)

假设您已经定义了这样的枚举:

package Const;

public enum myEnum {
    test;
}

和这样的注释:

public @interface test {
    myEnum value();
}

答案 1 :(得分:3)

使用enum应该没有任何问题,问题可能在于您如何声明它或注释。这是一个没有任何问题编译的例子。

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

    MyEnum value();

    public enum MyEnum {
        ONE, TWO, THREE, FOUR
    }
}

public class AnnotationTest {

    @MyAnnotation(MyEnum.ONE)
    public void someMethod() {
        //...
    }

}

答案 2 :(得分:1)

如果注释在您的控件范围内,请将属性类型设为enum类型,而不是String。否则就不可能。

此外,注释,如每个java类,应以大写字母开头(即Test,而不是test):

// retention, target here
public @interface Test {
    YourEnum value();
}

答案 3 :(得分:0)

如果希望将注释参数限制为枚举类型的值,则将该类型赋予参数,而不是String。枚举类型是枚举类型,并且无法解决调用“toString”不是“常量”转换的事实。

答案 4 :(得分:0)

参数不能是方法的结果,即toString()

但是你应该能够使用枚举常量。