Débarrassez-vous du message «La valeur de l’atsortingbut d’annotation doit être une expression constante»

J’utilise l’annotation dans mon code et j’essaie d’utiliser une valeur qui détermine en temps d’exécution.

Je définis ma liste comme static final (lst), et j’ajoute à cette liste des éléments.

Lorsque j’utilise lst.get(i) , j’obtiens une erreur de compilation:

 The value for annotation atsortingbute must be a constant expression 

Quelle est la solution à ce problème?

La valeur d’une annotation doit être une constante de compilation, il n’y a donc pas de moyen simple de faire ce que vous essayez de faire.

Voir aussi ici: Comment fournir une valeur à une annotation à partir d’un java constant

Il est possible d’utiliser des outils de compilation (ant, maven?) Pour le configurer si la valeur est connue avant d’essayer d’exécuter le programme.

c’est une ressortingction de non-sens; Ce n’est pas parce que cela a été implémenté que c’est la bonne façon. Peut-être ont-ils voulu entrer dans des phases et d’abord mettre en œuvre des contraintes de validation du temps de compilation, mais cela ne signifie pas que nous devons nous arrêter là et parler de son manque de souplesse.

Je pense qu’il est temps de faire du bruit sur la nécessité de valider les contraintes au moment de l’exécution, même si cela entraîne un petit impact sur les performances. Les contraintes qui ont des valeurs de compilation doivent être validées à l’aide d’implémentations de validateur de compilation et celles qui ont des valeurs d’exécution doivent être validées à l’aide d’implémentations de validateurs d’exécution.

Nous devrions mieux faire une demande d’amélioration avec le comité d’experts JSR 303 pour append cette fonctionnalité ou peut-être est-ce une limitation de la fonctionnalité Annotation elle-même. La demande doit donc être envoyée au groupe d’experts JSR-250.

Voici à quoi ressemble une expression constante en Java:

 package com.mycompany.mypackage; public class MyLinks { // constant expression public static final Ssortingng GUESTBOOK_URL = "/guestbook"; } 

Vous pouvez l’utiliser avec des annotations comme suit:

 import com.mycompany.mypackage.MyLinks; @WebServlet(urlPatterns = {MyLinks.GUESTBOOK_URL}) public class GuestbookServlet extends HttpServlet { // ... }