2010-08-04 35 views
3

不确定标题是否具有误导性,但要求在下面。Java中的Typesafe枚举

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

java属性值必须是常量。

@test("test") // works 

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

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

谢谢。

回答

1

如果注释是你的控制范围之内,使属性类型是enum类型,而不是String。否则,这是不可能的。

此外,注释,因为每个Java类,应与大写(即Test,不test)开始:

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

谢谢..我不能改变注释的定义,所以我想你断言这个用法是不可能的! – bsr 2010-08-04 16:22:05

0

如果要将annotation参数限制为枚举类型的值,则将该类型赋予该参数,而不是String。枚举类型是一个枚举类型,调用“toString”不是一个“常量”转换的事实是没有办法的。

0

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

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

6

枚举可以注释一起使用。你应该做的是这样的:

@test(Const.myEnum.test) 

假设你已经定义了这样一个枚举:

package Const; 

public enum myEnum { 
    test; 
} 

和注释这样的:

public @interface test { 
    myEnum value(); 
} 
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() { 
     //... 
    } 

} 
+0

+1为详细示例..谢谢 – bsr 2010-08-04 16:22:58