【问题标题】:Provide similar to 'NO_VALUE' default for Annotation type attibute in the Annotation为 Annotation 中的 Annotation 类型属性提供类似于“NO VALUE”的默认值
【发布时间】:2014-04-03 07:05:35
【问题描述】:

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

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

   String value() default "";

}

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

    A a() default ???;

}

@B 可以在没有任何属性的情况下使用的逻辑,但是,当然,这并不意味着(根据 Annotation 规范)它的属性会有空值。

从另一边@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”并摆脱数组样式?

【问题讨论】:

    标签: java annotations


    【解决方案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);
    }
    

    【讨论】:

    • 好的。谢谢。我想我继续使用array,因为您可以将其用作单值属性。从另一面来看,我的注释没有value attrbiute,但有很多其他非字符串属性及其默认值。而且我不能引入新的“假”value attrbiute,因为我的注释是开源框架的公共 API。
    猜你喜欢
    • 2011-11-17
    • 2019-01-02
    • 2011-01-04
    • 1970-01-01
    • 2011-03-17
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多