2010-03-27 17 views
7

Quiero utilizar una anotación en forma de compilación segura.Enumeraciones y anotaciones

Para pasar el valor() a la Anotación, quiero usar la representación de Cadena de una enumeración.

¿Hay alguna manera de usar @A con un valor de enum 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(); 
} 

actualización

necesito el tipo String en @A.

El punto es que puedo hacer esto

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

Pero aquí el compilador reclamaciones "valor del atributo debe ser constante". ¿No es E.a constante?

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

Respuesta

9

El problema es que eres más inteligente que el compilador :-)

E.a es una constante, pero E.a.toString() no lo es. Parece que debería ser, pero el compilador no puede resolverlo.

El motivo por el cual "a"+"b" y "" + 1 funcionan es que el compilador es lo suficientemente inteligente como para generar las constantes en tiempo de compilación.

Cuando ve "" + E.a, usa E.a.toString(). La llamada al toString() es suficiente para tirarla.

¿E tiene que ser una enumeración? Puedes probar:

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

"¿E tiene que ser una enumeración? Podrías probar: ..." Creo que puedes hacer algo similar con las enumeraciones también. Tendría que pasar el String que desea en el constructor para 'E', luego asignarlo a' public string strRepresentation'. Y luego simplemente haga '@A (E.strRepresentation)' – MatrixFrog

+0

@MatrixFrog Incluso si puse 'public final String strRepresentation =" foo ";' en E, obtengo 'el valor del atributo debe ser constante' – leedm777

7

hacer que el valor en la anotación de tipo E:

@interface A { 
    E value(); 
} 

continuación, puede utilizar

@A(E.a)