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。