2012-09-27 22 views
9

Estoy escribiendo el código de Java que usa Jackson para la serialización de JSON. Una anotación que debo usar antes de una de mis clases es @JsonTypeName(/*Insert string here*/), para darle a un objeto de esta clase un identificador único para la serialización. En mi código actual, establecemos el argumento String usando una constante global de otra clase. Ejemplo:Incapacidad de Java para utilizar enum como un argumento de cadena para una anotación (por ejemplo: Jackson)

public class AnnotationValues { 
    private static final String id1 = "1"; 
    private static final String id2 = "2"; 
    private static final String id3 = "3"; 
    // And so on... 
} 

El uso de esta clase, nuestra anotación se vería @JsonTypeName(AnnotationValues.id1). Personalmente, no creo que este sea un estilo de codificación muy robusto, para usar una clase de constantes String globales. Esto se volvería molesto una vez que mi aplicación necesita manejar una mayor cantidad de mensajes JSON y, por lo tanto, requiere muchos identificadores diferentes. Naturalmente, resolvería este problema, en general, usando un enum. Me gustaría sustituir a la clase con:

public enum AnnotationValues { 
    ID1("1"), 
    STATS_RESPONSE("2"), 
    SESSION_RESPONSE("3"), 
    /* Add more... */; 
    public final String value; 
    private AnnotationValues(String value) { 
     this.value = value; 
    } 
} 

Usando esta enumeración, quiero escribir @JsonTypeName(AnnotationsValues.ID1.value) como mi anotación. Pero esto no funciona. Aparece este mensaje de error: "El valor para el atributo de anotación JsonTypeName.value debe ser una expresión constante". Una simple búsqueda en Google/SOF me llevó al this SOF post y me dijo por qué era un error; un valor de cadena para un parámetro de anotación debe ser una constante. Es bastante molesto que no pueda usar un enum.

¿Alguien más se encuentra con este problema? ¿Cuál es la solución aceptada para este tipo de problema? ¿Realmente se supone que debo usar una larga lista de constantes de cadena para mis anotaciones? ¿Hay alguna forma de que pueda rescatar usando mi Enum? ¿Algo más?

+0

Lo sentimos, pero ¿cómo es que _no_ es un duplicado de esa publicación que citas? http://stackoverflow.com/questions/3271659/use-enum-type-as-value-parameter-for-rolesallowed-annotation – Gray

Respuesta

6

Realmente me gustaría que yo u otra persona pudiera darle una respuesta diferente, pero no, no hay otra manera que funcione mejor. En casos como este, todos estamos atrapados usando una clase llena de cadenas estáticas finales. La forma en que trataste de hacerlo funcionar debería funcionar, pero no es así. Por ahora, esta es la forma en que es en Java. Una vez me encontré con este problema y también me molestó descubrir que los Enums no pueden ser tratados como expresiones constantes. Siento tu dolor y, una vez más, desearía darte una respuesta diferente.

-1

Según lo sugerido por la otra respuesta, no, esto no es posible con las anotaciones de Java.

Pero quería preguntarle esto: ¿por qué crees que el uso de Enum sería mejor que usar constantes de cadena? Para mí, los enfoques son similares, y por pura simplicidad, ¿cuál sería el sentido de agregar Enum wrapper? La referencia es similar en ambos casos, y las constantes reales se almacenan en un lugar centralizado que tiene sus ventajas, por lo que puede compartir las mismas cadenas.

Así que no entiendo muy bien "no creo que este es un estilo de codificación muy robusto", comentario, o al menos no cómo mejoraría uso de adicionales que no hace nada Enum envoltorio de diseño.

+0

Cuando dices que algo debe ser un Enum específico, entonces restringes las posibles entradas para un método dado o anotación en este caso. Si tiene que usar constantes de cadena, las cadenas podrían proceder de cualquier lugar y la finalización del código no le dará las opciones obvias de Enum como lo haría si pudiera escribirlo fuertemente en un tipo Enum. – Novaterata

+0

@novaterata Las constantes estarían dentro de una clase de contenedor específica, por lo que la finalización automática funcionaría bien. Y si bien es cierto que IDE (o compilador) no pudo evitar que pasara cadenas arbitrarias desde otro lugar, realmente parece un intento de resolver un problema que realmente no existe. – StaxMan

Cuestiones relacionadas