90 votes

Erreur lors de la définition d'une valeur null par défaut pour le champ d'une annotation

Pourquoi ai-je une erreur "La valeur de l'attribut doit être constante". N'est-ce pas une constante nulle ???

 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeInterface {
    Class<? extends Foo> bar() default null;// this doesn't compile
}
 

72voto

Logan Murphy Points 2112

Essaye ça

 @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeInterface {
    Class bar() default void.class;
}
 

Il ne nécessite pas de nouvelle classe et c'est déjà un mot-clé en Java qui ne veut rien dire.

71voto

Yishai Points 42417

Je ne sais pas pourquoi, mais le JLS est très clair:

 Discussion

 Note that null is not a legal element value for any element type.

Et la définition d'un élément par défaut est:

     DefaultValue:
         default ElementValue

Malheureusement, je continue de trouver que les nouvelles fonctionnalités du langage (Énumérations, et maintenant les Annotations) ont très peu serviable messages d'erreur du compilateur lorsque vous ne respectez pas la langue spec.

EDIT: UN peu googleing trouvé le suivant dans la JSR-308, où ils font valoir pour autoriser les valeurs null dans cette situation:

On note quelques objections à la proposition.

La proposition de ne pas faire quelque chose de possible qui n'était pas possible avant.

Le programmeur définie par une valeur spéciale fournit une meilleure documentation de la valeur null, ce qui pourrait signifier "none", "non initialisé", null lui-même, etc.

La proposition est plus enclin à l'erreur. Il est beaucoup plus facile d'oublier la vérification null que d'oublier de vérifier qu'une valeur explicite.

La proposition peut faire la norme de l'idiome plus verbeux. Actuellement, seuls les utilisateurs d'une annotation besoin de vérifier pour ses valeurs. Avec la proposition, de nombreux outils que les processus d'annotations devra vérifier si la valeur d'un champ est null, de peur de jeter une exception de pointeur null.

Je pense que seuls les deux derniers points sont pertinents à "pourquoi ne pas le faire en premier lieu." Le dernier point apporte certainement un bon point - un processeur d'annotation n'a jamais à être concernés qu'ils obtiendront une valeur null sur une annotation de la valeur. J'ai tendance à voir qu'à mesure que le travail d'annotation des transformateurs et d'autres cadre de ce type de code pour faire ce genre de vérifier les développeurs de code plus clair plutôt que l'inverse, mais il serait certainement difficile de justifier le changement.

55voto

skaffman Points 197885

Il semblerait que ce soit illégal, même si le JLS est très flou à ce sujet.

Je me suis sauvé la mémoire pour essayer de penser à une annotation existante contenant l'attribut Class d'une annotation et je me suis souvenu de celle-ci à partir de l'API JAXB:

 @Retention(RUNTIME) @Target({PACKAGE,FIELD,METHOD,TYPE,PARAMETER})        
public @interface XmlJavaTypeAdapter {
    Class type() default DEFAULT.class;

    static final class DEFAULT {}    
}
 

Vous pouvez voir comment ils ont dû définir une classe statique factice pour contenir l'équivalent d'un null.

Désagréable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X