Java 提供类似于';无#u值';注释中注释类型attibute的默认值

Java 提供类似于';无#u值';注释中注释类型attibute的默认值,java,annotations,Java,Annotations,我有两个注解。第一个从第二个开始使用: @Target({ }) @Retention(RUNTIME) public @interface A { String value() default ""; } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface B { A a() default ???; } @B的逻辑可以在没有任何属性的情况下使用,但是,当然

我有两个注解。第一个从第二个开始使用:

@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\u VALUE”时,应该保护它不受最终用户的影响

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

A a() default NO_A;
没有帮助:它没有被编译

作为解决方法,我使用
数组

A[] a() default {};
并在注释处理器中检查
a
属性的大小


是否还有其他一些选项可以使用默认值标记
a()
,使其类似于“NULL”并摆脱数组样式?

似乎没有任何干净的方法为注释字段创建默认NULL值。下面是一些信息,说明了为什么要这样设计,以及使用类类型时的解决方法:

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

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

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

好啊谢谢我想我继续使用
数组
,因为您可以将它用作单值属性。另一方面,我的注释没有
value
attrbiute,但有许多其他非字符串属性及其默认值。我不能引入新的“假”
value
attrbiute,因为我的注释是开源框架的公共API。