重构注释但保留旧注释名称以实现向后兼容

时间:2013-05-01 00:42:21

标签: java annotations refactoring

所以我有一个问题,我不确定它是否可以解决。

我有一个有方法注释的库

@Retention(RetentionPolicy.RUNTIME)
public @interface CallbackHandler {...}

对于库的下一个版本,我想复制这个注释并重命名它,但是为了向后兼容性,请将这个旧注释留给@Deprecated,这样在人们进行切换时不会有一个难以理解的错误。

问题是因为我不能对注释进行子类化,所以我必须编写两次所有代码来处理两个不同的注释。我想避免这种情况,因为它存在问题,而且时间很长。

所以问题是有没有办法重命名新版本的注释,但保持向后兼容性,而不必编写两个版本的代码?

1 个答案:

答案 0 :(得分:1)

我想到的一种方法是使用注释代理,例如来自Hibernate Validator项目的this onethis one(免责声明:我是后者的提交者)。

您可以根据新注释中的属性值为旧的,现已弃用的注释创建代理。这样,处理注释的代码可以保持不变。

或者您重构代码以处理新的注释类型,并在发现旧注释类型时为新注释类型创建代理,您可以稍后逐步淘汰。