在维护对Java 7的支持的同时使用@Repeatable
Java 8通过使用“容器”注释来支持可重复注释:
@Repeatable(FooContainer.class) @interface Foo { String value(); } @interface FooContainer { Foo[] value(); } @Foo("bar") @Foo("baz") public class SomeClass { }
我有一个库,我想支持Java 7(或更新版本)。 该库广泛使用注释,并且可以从支持可重复注释中获益。
根据我的理解,容器注释甚至可以在Java 7中工作,只有一个人必须使用它:
@FooContainer({@Foo("bar"),@Foo("baz")}) public class SomeClass { }
我最终会喜欢的是:如果我的库的用户使用Java 8,则用户将能够使用重复的注释。 如果用户使用Java 7,他必须坚持手动编写容器注释。
这样的事情有可能吗?
您需要提供两个版本的库:
- 一个打算与Java 8一起使用的,它用
@Repeatable
元注释Foo
的定义。 - 一个旨在与Java 7一起使用的Java 7,它明确定义了
Foo
和FooContainer
。
遗憾的是,您不能同时支持Java 7并使用一个版本的库重复注释。 如果您希望客户端能够重复注释,则必须将Foo
元注释为@Repeatable
。 java.lang.annotation.Repeatable
仅在Java 8中定义。因此,如果注释Foo
被元注释为@Repeatable
,则Foo
和SomeClass
都只能在JDK 8及更高版本上编译和运行。 (它只能在JDK 8上运行,因为当加载SomeClass时,将加载Foo,并且将加载Foo上的任何元注释。)