Soll der Mapping-Wert in einer Konstanten oder als Enum deklariert werden?

8

Ich sehe das überall in Code-Basis verstreut:

%Vor%

Ich würde lieber so etwas verwenden:

%Vor%

Es scheint DRY zu brechen, indem der tatsächliche String-Wert in @RequestMapping anstelle von constant verwendet wird. Aber ist das eine gute Code-Praxis? Soll ich stattdessen ein enum verwenden? Ich muss möglicherweise Constants.myValue an anderer Stelle in der Codebasis verwenden.

    
blue-sky 31.07.2012, 13:18
quelle

1 Antwort

12
  

Soll ich stattdessen ein enum verwenden?

Sie können nicht. Annotationsvariablen müssen Kompilierzeitkonstanten sein. Enums und String-Literale sind beides, aber Sie können keine enum erstellen, die eine Zeichenfolge ist und @RequestMapping benötigt eine Zeichenfolge (und wenn Ihre enum eine Methode hat, die ein String- oder String-Feld zurückgibt, ist das keine Kompilierzeitkonstante ). Da es mehrere Annotationsverarbeitungsrunden gibt, funktioniert es, wenn die Konstante in einer anderen Klasse ist.

Das sagte: Ja, ich würde sagen, eine dedizierte Konstanten-Klasse (vielleicht mehrere, für verschiedene Arten von Konstanten) ist eine gute Praxis, die ich benutze wann immer ich kann (und es funktioniert mit Annotationen solange die Konstante a) ist nicht innerhalb derselben Kompilierungseinheit definiert, die die Annotation hat, und b) wird in der Deklaration initialisiert (im Gegensatz zu einem statischen Initialisierungsblock)).

Hier ist ein Beispiel:

Controller

%Vor%

Konstantenklasse

%Vor%

Und hier sind einige Versionen, die nicht funktionieren:

a)

%Vor%

Dies wird nicht kompiliert, da die Annotation eine Konstante innerhalb der Annotationsklasse referenziert. Dies kann nicht funktionieren, da Annotationen während der Kompilierung in einer separaten Runde vor dem Rest des Codes verarbeitet werden, während die Klasse die Annotation bereits für die Kompilierung verarbeiten muss (d. H. Es liegt eine bestimmte Abhängigkeit zwischen Annotation und Konstante vor)

b)

%Vor%

Obwohl dies ein statisches Endfeld ist, ist es keine Kompilierzeitkonstante, daher kann es nicht als Annotationsparameter verwendet werden

    
Sean Patrick Floyd 31.07.2012, 13:39
quelle

Tags und Links