注释默认“null”值

问题描述 投票:0回答:3

是否可以指定默认为空的注释?

我想要实现的是诸如可选注释属性之类的东西。

例如

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; }

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

java annotations
3个回答
34
投票
不可以,您不能使用

null

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

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

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

6
投票
尝试一下:

Config value() default @Config();
    

0
投票
@Sotirios Delimanolis 的答案是正确的,但我想解释一下为什么存在这种限制。

在 Java 中,注释属性值不能是

null

,因为 
JLS 定义注释属性必须具有一个在编译时已知的常量值。因此,注释属性可能是:

    编译时已知的常量表达式(如
  1. 1
    "Hello"
    Month.JULY
     等)
  2. 元素值对(据我所知,它就像其他注释
  3. @Config
  4. 数组初始值设定项(如
  5. {1, 2, 3}
如您所见,

null

不被视为编译时已知的值。因此你有这个限制。因此,并不是说 null
 被语言开发人员以某种方式明确排除为注释值,它只是在编译时不被认为是已知的:)

© www.soinside.com 2019 - 2024. All rights reserved.