Java kann Enum nicht als String-Argument für eine Annotation verwenden (zB Jackson)

9

Ich schreibe Java-Code, der Jackson für die JSON-Serialisierung verwendet. Eine Anmerkung, die ich vor einem meiner Klassen verwenden muss, ist @JsonTypeName(/*Insert string here*/) , um einem Objekt dieser Klasse eine eindeutige Kennung für die Serialisierung zu geben. In meinem aktuellen Code legen wir das String-Argument fest, indem wir eine globale Konstante aus einer anderen Klasse verwenden. Beispiel:

%Vor%

Mit dieser Klasse würde unsere Annotation wie @JsonTypeName(AnnotationValues.id1) aussehen. Ich persönlich glaube nicht, dass dies ein sehr robuster Programmierstil ist, um eine Klasse globaler String-Konstanten zu verwenden. Dies würde ärgerlich werden, sobald meine Anwendung eine größere Anzahl von JSON-Nachrichten verarbeiten muss und daher viele verschiedene Kennungen benötigt. Ich würde natürlich dieses Problem im Allgemeinen lösen, indem ich enum verwende. Ich würde die Klasse durch ersetzen:

%Vor%

Mit dieser Aufzählung möchte ich @JsonTypeName(AnnotationsValues.ID1.value) als Anmerkung schreiben. Aber das funktioniert nicht. Ich erhalte diese Fehlermeldung: "Der Wert für das Annotationsattribut JsonTypeName.value muss ein konstanter Ausdruck sein" . Eine einfache Google / SOF-Suche führte mich zu diesem SOF-Beitrag mir zu sagen, warum das ein Fehler war; Ein String-Wert für einen Annotation-Parameter muss eine Konstante sein. Ziemlich nervig, dass ich kein enum benutzen kann.

Hat jemand anderes dieses Problem? Was ist die akzeptierte Lösung für diese Art von Problem? Soll ich eigentlich eine lange Liste von String-Konstanten für meine Annotationen verwenden? Kann ich mit meiner Enum irgendwie retten? Sonst noch etwas?

    
ecbrodie 27.09.2012, 15:58
quelle

2 Antworten

6

Ich wünschte wirklich, ich oder jemand anders könnte Ihnen eine andere Antwort geben, aber nein, es gibt keinen anderen Weg, der besser funktioniert. In solchen Fällen stecken wir alle in einer Klasse voller statischer Finalstrings. Die Art und Weise, wie Sie versucht haben, es zum Laufen zu bringen, sollte funktionieren, tut es aber nicht. Im Moment ist das genau so in Java. Ich bin selbst einmal auf dieses Problem gestoßen, und ich war auch genervt, dass Enums nicht als konstante Ausdrücke behandelt werden können. Ich fühle deine Schmerzen und möchte dir noch einmal eine andere Antwort geben.

    
James Dunn 19.03.2013 17:16
quelle
-1

Wie von der anderen Antwort vorgeschlagen, ist dies mit Java-Anmerkungen nicht möglich.

Aber ich wollte das fragen: Warum denkst du, wäre die Verwendung von Enum besser als die Verwendung von String-Konstanten? Für mich sehen die Ansätze ähnlich aus, und aus Gründen der Einfachheit, was wäre der Sinn des Hinzufügens von Enum-Wrapper? Die Referenz ist in beiden Fällen ähnlich, und die tatsächlichen Konstanten werden an einem zentralen Ort gespeichert, was ihre Vorteile hat, so dass Sie dieselben Strings teilen können.

Also verstehe ich nicht ganz "glaube nicht, dass dies ein sehr robuster Codierungsstil ist", Kommentar, oder zumindest nicht, wie die Verwendung von zusätzlichen Do-nothing-Enum-Wrappern das Design verbessern würde.

    
StaxMan 02.04.2015 06:10
quelle