Class<? extends Foo> bar() default null;// this doesn't compile
如前所述,Java语言规范不允许在注释的默认值中使用null值。
我倾向于在注释定义的顶部定义一个DEFAULT_VALUE常量。像这样:
```java
public @interface MyAnnotation {
String value() default DEFAULT_VALUE;
static final String DEFAULT_VALUE = "default";
}
```
public @interface MyAnnotation {
public static final String DEFAULT_PREFIX = "__class-name-here__ default";
...
public String prefix() default DEFAULT_PREFIX;
}
接着在我的代码中,我会做如下的操作:
if (myAnnotation.prefix().equals(MyAnnotation.DEFAULT_PREFIX)) { ... }
针对您的情况,我建议您定义一个标记类。不幸的是,您不能为此定义一个常量,因此需要执行以下操作:
public @interface MyAnnotation {
public static Class<? extends Foo> DEFAULT_BAR = DefaultBar.class;
...
Class<? extends Foo> bar() default DEFAULT_BAR;
}
您的DefaultFoo
类只是一个空实现,以便代码可以执行以下操作:
if (myAnnotation.bar() == MyAnnotation.DEFAULT_BAR) { ... }
希望这能有所帮助。
null
不是常量吗?” 答案是否定的,在Java中,null
不是一个常量。在任何需要编译时常量的地方都不能使用null
。例如,尝试在你的注解中添加String foo() default "" + null;
。我们知道,该表达式可预测地评估为"null"
,但它不是一个常量表达式,因此不允许使用。 - Holger