java 注解默认“null”值

mspsb9vt  于 11个月前  发布在  Java
关注(0)|答案(3)|浏览(168)

是否可以将空值作为默认值指定注解?
我想实现的是类似于可选注解属性的功能。
例如

public @interface Foo {

    Config value();

}

public @interface Config {

    boolean ignoreUnknown() default false;
    int steps() default 2;
}

字符串
我想使用@Foo(不指定值,所以它应该是某种可选的),我也希望能够写这样的东西:

@Foo (
    @Config(
        ignoreUnknown = true,
        steps = 10
    )
)


有没有可能用注解来做这样的事情?
我不想做这种事

public @interface Foo {

   boolean ignoreUnknown() default false;
   int steps() default 2;
}


因为我希望能够区分一个属性是否被设置(而不是它是否有默认值)。
描述起来有点复杂,但我正在使用一个小的Annotation Processor来生成Java代码。然而,在运行时,我想设置一个默认配置,该配置应该用于所有@Foo,除了那些使用@Config设置自己配置的人。
所以我想要的是这样的

public @interface Foo {

       Config value() default null;

 }


但据我所知,这是不可能的,对吧?有人知道这样一个可选属性的变通方法吗?

hgb9j2n6

hgb9j2n61#

不能,你不能使用null作为注解属性值。但是你可以使用数组类型并提供一个空数组。

public @interface Foo {
    Config[] value();  
}
...
@Foo(value = {})

字符串

public @interface Foo {
    Config[] value() default {};  
}
...
@Foo

dwbf0jvd

dwbf0jvd2#

试试看:

Config value() default @Config();

字符串

bqucvtff

bqucvtff3#

@Sotirios Delimanolis的答案是正确的,但我想解释为什么存在这种限制。
在Java中,annotation属性值不能是null,因为JLS定义annotation属性必须具有编译时已知的常量值 *。因此,annotation属性可能是:
1.在编译时已知的常量表达式(如1"Hello"Month.JULY等)
1.一个元素值对(afaik它就像其他注解@Config
1.数组初始化器(如{1, 2, 3}
正如你所看到的,null在编译时不被认为是已知的值。因此你有这个限制。所以并不是说null被语言开发人员特别排除为注解值,它只是在编译时不被认为是已知的:)

相关问题