我有两个注释。第一个用于第二个:
@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”一样摆脱数组样式?
答案 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);
}