在保持对Java 7的支持的同时使用@Repeatable

时间:2015-04-09 15:18:39

标签: java annotations java-8 javac

Java 8通过使用" container"来支持可重复注释。注释:

@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,他必须坚持手动编写容器注释。

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

您需要提供两个版本的库:

  • 旨在与Java 8一起使用的一个,它对该定义进行元注释 Foo@Repeatable
  • 旨在与Java 7一起使用的一个,它明确定义了FooFooContainer

不幸的是,您不能同时支持Java 7并使用一个版本的库重复注释。如果您希望客户能够重复注释,则必须将Foo元注释为@Repeatablejava.lang.annotation.Repeatable仅在Java 8中定义。因此,如果注释Foo被元标注为@Repeatable,则FooSomeClass都只能编译和运行在JDK 8及以上版本。 (它只能在JDK 8上运行,因为当加载SomeClass时,将加载Foo,并且将加载Foo上的任何元注释。)