什么会导致向后兼容不可能?

时间:2011-06-28 08:50:34

标签: java backwards-compatibility api-design

我们有一个平台组件(用Java编写),现在应该在一段时间内向后兼容,例如3年。 是否有可能实现新功能或修复错误必须要求平台中的接口更改?

一个具体的例子是,假设平台中定义了某种监听器接口,客户端代码将实现监听器。稍后在监听器中似乎需要一个新方法来引入一个新功能,但我们不能这样做,因为它会破坏接口,以便某些客户端无法编译。

创建一个使用新方法扩展原始界面的新界面是一个好主意吗?需要此新功能的客户端现在将实现新接口,并且不需要更改其他客户端代码。当然,平台中的调用现在应该检查监听器的类型,如果它是新方法的新接口,那么将调用新方法,或者什么都不做。

这种改变可能会使代码看起来不那么简单,但我想它仍然有效。是否有必要在平台中更改接口?

1 个答案:

答案 0 :(得分:3)

  

是否有可能实现新功能或修复错误必须要求平台中的接口更改?

是的,如果此错误是向后兼容性的意外中断,并且在检测到此中断之前您已发布了该产品的多个版本(X + 1 ... X + N)。因此,您的一部分客户端依赖于旧版本X,但另一部分客户端依赖于X + 1 ... X + N损坏版本。如果你要解决这个问题,那么新的客户端(X + 1 ... X + N)将被破坏。

  

创建一个使用新方法扩展原始界面的新界面是不是一个好主意?

可能,但是您可能会遇到这些接口命名和文档编译的问题。我建议你延迟这些功能并每隔3年打破一次API,并提供有关如何更换旧客户的详细说明。

  

当然,平台中的调用现在应该检查监听器的类型,如果它是新方法的新接口,那么将调用新方法,或者什么都不做。

有3种向后兼容性:二进制(运行旧客户端),(重新编译旧客户端)和行为。如果需要向接口添加新方法,则只能通过检查已使用的接口版本(final String VERSION =“N”)并仅为兼容版本调用new方法来中断源兼容性,但保持二进制兼容性。因此,如果某个旧客户端需要新功能,则应更改并重新编译。