2010-03-27 158 views
7

我想在编译安全的表单中使用Annotation。枚举和注释

要将value()传递给Annotation,我想要使用枚举的String表示形式。

有没有办法使用@A与来自枚举E的值?

public class T { 

    public enum E { 
     a,b; 
    } 

    // C1: i want this, but it won't compile 
    @A(E.a) 
    void bar() { 

    // C2: no chance, it won't compile 
    @A(E.a.toString()) 
    void bar2() { 

    } 
    // C3: this is ok 
    @A("a"+"b") 
    void bar3() { 

    } 

    // C4: is constant like C3, is'nt it ? 
    @A(""+E.a) 
    void bar4() { 

    } 
} 

@interface A { 
    String value(); 
} 

更新

我需要@A String类型。

的一点是我可以做到这一点

@A("" + 1) 
    void foo() { 
} 

但这里的编译器索赔“的属性值必须是常量”。 Is'nt E.a不变?

@A("" + E.a) 
    void foo() { 
} 

回答

9

的问题是,你比编译:-)

更聪明

E.a是一个常数,但是E.a.toString()不是。它看起来应该是这样,但编译器无法弄清楚。

"a"+"b""" + 1工作原因是编译器足够聪明,可以在编译时生成常量。

当它看到"" + E.a时,它使用E.a.toString()。致电toString()就足以将其抛弃。

E必须是枚举吗?你可以尝试:

public final class E { 
    public static final String a = "a"; 
    public static final String b = "b"; 
}; 
+0

“E必须是一个枚举吗?你可以试试:......”我认为你也可以用enums做类似的事情。你必须在'E'的构造函数中传入你想要的字符串,然后将它分配给'public final String strRepresentation'。然后只要做@A(E.strRepresentation)' – MatrixFrog 2010-03-28 04:47:27

+0

@MatrixFrog即使我把'public final String strRepresentation =“foo”;'放在E上,我得到'属性值必须是常量' – leedm777 2010-03-28 04:55:33

7

请在E型的标注值:

@interface A { 
    E value(); 
} 

然后你可以使用

@A(E.a)