Class<? extends Foo> bar() default null;// this doesn't compile
Como se ha mencionado, la especificación del lenguaje Java no permite valores nulos en los valores predeterminados de anotaciones.
Lo que suelo hacer es definir las constantes DEFAULT_VALUE
en la parte superior de la definición de la anotación. Algo así como:
public static final String DEFAULT_VALUE = "__class-name-here__ default";
public String prefix() default DEFAULT_VALUE;
Luego, en mi código que hago algo así como:
if (myAnnotation.prefix().equals(MyAnnotation.DEFAULT_VALUE)) { ... }
En caso de que con una clase, me acaba de definir una clase de marcador. Por desgracia no se puede tener una constante de este modo su lugar usted necesita para hacer algo como:
Class<? extends Foo> bar() default DefaultFoo.class;
Su clase DefaultFoo
sería simplemente una implementación vacío, por lo que el código puede hacer:
if (myAnnotation.bar() == DefaultFoo.class) { ... }
Esperanza esta ayuda a alguien más
Sí, hacemos algo similar (simplemente usamos Foo.class como valor predeterminado). Sucks. – ripper234
Y en el caso de los campos String, debe recurrir a [magic strings] (http://en.wikipedia.org/wiki/Magic_string). Aparentemente, los antipatrones conocidos son mejores que las características del lenguaje bien conocidas en la actualidad. –
@TimYates Me mata ver a las personas definir su propio valor centinela "sin valor" cuando null está disponible y se entiende universalmente. ¡Y ahora el idioma en sí lo exige! Afortunadamente, puede definir sus "cadenas mágicas" como constantes públicas. Todavía no es ideal, pero al menos el código que busca su anotación puede hacer referencia a la constante en lugar de usar literales en todas partes. – spaaarky21