在Annotation中为Annotation type属性提供类似的“NO VALUE”默认值

时间:2014-04-03 07:05:36

标签: java annotations

我有两个注释。第一个用于第二个:

@Target({ })
@Retention(RUNTIME)
public @interface A {

   String value() default "";

}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface B {

    A a() default ???;

}

@B可以在没有任何属性的情况下使用的逻辑,当然,它并不意味着(通过注释规范)它的属性将具有空值。

从另一边@A.value() == ""对我的逻辑也是好的。这意味着:

A a() default @A;

不适合我。

所以,我需要一个案例,当我可以确定@B.a()类似于' NO_VALUE'它应该受到最终用户的保护。

static final A NO_A = new A() {};

A a() default NO_A;

没有帮助:它没有被编译。

作为一种解决方法,我使用array

A[] a() default {};

并在注释处理器中检查a属性的大小。

是否还有一些其他选项可以将a()标记为默认值,使其像“NULL' -like”一样摆脱数组样式?

1 个答案:

答案 0 :(得分:1)

似乎没有任何干净的方法来为注释字段创建默认的空值。以下是一些信息,为什么设计这种方式并在使用类类型时采用变通方法:Error setting a default null value for an annotation's field

我认为使用像你提出的数组是处理这个问题的好方法。只是出于技术原因记录它是一个数组,并在与多个元素一起使用时抛出错误。

我想到的唯一其他解决方案是使用魔术字符串作为默认值A的值。根据用例,我会选择一些不太可能用于任何用户的长随机字符串,或者使用其他任何特殊值的文档。

public @interface B {
    final String DEFAULT = "_a_default_value";
    A a() default @A(DEFAULT);
}