Java 使用注释创建API的多个版本
是否可以使用注释来创建API的多个版本 我有一个需要实现的目标API,但它随着时间的推移而增长,我希望支持多个级别——如果可能的话,在同一个分支中。我已经考虑过拆分API并将其代理到实现库,但这仍然需要大量代码来保持同步 因此,您可以创建如下代码:Java 使用注释创建API的多个版本,java,compiler-construction,annotations,preprocessor,Java,Compiler Construction,Annotations,Preprocessor,是否可以使用注释来创建API的多个版本 我有一个需要实现的目标API,但它随着时间的推移而增长,我希望支持多个级别——如果可能的话,在同一个分支中。我已经考虑过拆分API并将其代理到实现库,但这仍然需要大量代码来保持同步 因此,您可以创建如下代码: @Since("1.2") <- only created when 1.2 or higher public interface InNewerAPI { @Since("1.3") <- only compiled when
@Since("1.2") <- only created when 1.2 or higher
public interface InNewerAPI {
@Since("1.3") <- only compiled when 1.3 or higher
public void methodInEvenNewerAPI();
}
当然,我也可以为此使用预处理器,但我希望避免使用Java代码的预处理器
这种方法是否有任何缺点,例如在1.8之前丢失参数名称
注意,我需要支持接口和类,包括抽象类和内部类。方法和常量也需要进行版本控制。好的,我认为您确实可以使用注释来标记应该公开API的版本范围。例如,如果在版本1.1中引入了方法foo。并且在版本1.5中已弃用,您可以将其标记为: 类myapimpl{ @从1.2开始 @反对1.4 @直到1.5 傅; } 然后您可以根据客户端版本自动生成接口MyApi: 对于1.2版之前的客户端,此方法将不包括在接口中。 对于版本1.2和1.4之间的客户端,它将包括在内 对于客户端版本1.4,它将包括在内,但标记为@Deprecated 1.5之后的客户将不包括此项
我认为这是很优雅的。你说的是支持多个Java版本,而不是API的不同版本,对吗?你想如何使用这些注释?我的意思是,你想阻止老客户机调用新的API还是阻止老客户机看到它?@KevinSheehan不,我没有指定的API的不同版本,它包含接口和类。@AlexR后者,它们不应该出现在类文件中,例如,为了避免客户机为错误的系统生成。