注解默认值为“null”

26

可以指定一个默认为null的注释吗?

我的目标是实现可选注释属性。

例如:

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;
}
因为我想要区分一个属性是否已被设置(而不是它是否具有默认值)。
这有点复杂,但我正在开发一个小注解处理器,用于生成Java代码。然而在运行时,我希望设置一个默认配置,该配置应该用于所有的@Foo,除了那些使用@Config设置自己的配置的情况。
所以我想要的是这样的东西:
public @interface Foo {

       Config value() default null;

 }

但据我所知,这似乎不可能,对吗?有人知道这种可选属性的解决方法吗?


1
可能是为注释字段设置默认空值的错误的重复问题。 - fracz
3个回答

34

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

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

是的,但我总是不得不写@Foo(value = {}),而在90%的情况下,我不想提供另一个配置,所以我只想要@Foo - sockeqwe
4
很简单,只需设置一个“default {}”即可。 - Sotirios Delimanolis

6

尝试一下:

Config value() default @Config();

0
@Sotirios Delimanolis的答案是正确的,但我想解释一下为什么存在这种限制。
在Java中,注解属性值不能为null,因为JLS定义了注解属性必须具有在编译时已知的常量值。因此,注解属性可以是以下几种可能的情况:
1. 在编译时已知的常量表达式(例如1,"Hello",Month.JULY等); 2. 元素值对(类似于其他注解@Config); 3. 数组初始化器(例如{1, 2, 3})。
如你所见,null并不被视为在编译时已知的值。因此,你有这个限制。所以,并不是语言开发者特意将null排除在注解值之外,只是在编译时不被视为已知的值 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接