在维护对 Java 7 的支持时使用 @Repeatable
Using @Repeatable while mainaining support for Java 7
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 { }
我最终想要的是:如果我的图书馆的用户正在使用 Java8,用户将能够使用重复注释。如果用户使用Java7,他必须坚持手动编写容器注解。
这样的事情有可能吗?
您需要提供两个版本的库:
- 一个旨在与 Java 8 一起使用,它对定义进行元注释
Foo
和 @Repeatable
.
- 一个旨在与 Java 7 一起使用,它明确定义了
Foo
和 FooContainer
.
遗憾的是,您的一个版本的库不能同时支持 Java7 和重复注释。如果您希望客户端能够重复注释,那么 Foo
必须被元注释为 @Repeatable
。 java.lang.annotation.Repeatable
只在Java8中定义。因此,如果注释Foo
被元注释为@Repeatable
,则Foo
和SomeClass
都只能在 JDK 8 及更高版本上进行编译和 运行。 (它只能是 运行 on JDK 8 因为当加载 SomeClass 时,将加载 Foo,并且将加载 Foo 上的任何元注释。)
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 { }
我最终想要的是:如果我的图书馆的用户正在使用 Java8,用户将能够使用重复注释。如果用户使用Java7,他必须坚持手动编写容器注解。
这样的事情有可能吗?
您需要提供两个版本的库:
- 一个旨在与 Java 8 一起使用,它对定义进行元注释
Foo
和@Repeatable
. - 一个旨在与 Java 7 一起使用,它明确定义了
Foo
和FooContainer
.
遗憾的是,您的一个版本的库不能同时支持 Java7 和重复注释。如果您希望客户端能够重复注释,那么 Foo
必须被元注释为 @Repeatable
。 java.lang.annotation.Repeatable
只在Java8中定义。因此,如果注释Foo
被元注释为@Repeatable
,则Foo
和SomeClass
都只能在 JDK 8 及更高版本上进行编译和 运行。 (它只能是 运行 on JDK 8 因为当加载 SomeClass 时,将加载 Foo,并且将加载 Foo 上的任何元注释。)