2

我们正在向我们的 Java 库引入语义版本控制 ( http://semver.org/ )。

我们应该如何处理添加新的枚举值?我们的情况如下:

  • annotations.jar包含具有类型属性的注释MyEnum
  • util.jar具有使用注释的对象注释的对象annotations.jar
  • wsprovider.jar使用类似 jaxb 的技术将带注释的对象从util.jarweb api序列化
  • wsconsumer.jar使用由 提供的 web api wsprovider.jar,并根据 的值进行切换MyEnum以更改其行为。

如果我们向 中添加一个新值MyEnum,我们应该碰撞各种 jar 的哪些部分(主要/次要/补丁)?

在我看来,util.jar需要升级主要版本,因为 API 的更改方式可能会破坏现有代码。

按照同样的逻辑,这将波及到 和 中的一个主要wsprovider.jar碰撞wsconsumer.jar

是否annotations.jar需要一个主要版本的碰撞?

我会说是,因为枚举是一组封闭的值,所以代码(例如wsconsumer.jar)假设通过覆盖枚举中的所有值,它涵盖了所有可能的行为。向枚举添加一个新值然后打破它。

但是,本能地,将单个值添加到枚举中似乎有点多,并且具有相当大的连锁效应。

我想这只是我们需要习惯使用 semver 的东西吗?

4

1 回答 1

1

在您的情况下,添加新功能(例如添加新枚举常量)很少会破坏公共 API 的向后兼容性。我相信它可能对公共 API 造成的最大伤害是弃用其他一些枚举常量,这只会导致 SemVer 中指定的次要版本提升(FAQ:我应该如何处理弃用的功能?)。因此,您可能需要重新考虑添加新的枚举常量是否真的会破坏现有代码,因为我看不出它是如何做到的。

关于您的依赖项,还有一个您可能感兴趣的常见问题解答问题:如果我在不更改公共 API 的情况下更新自己的依赖项,我该怎么办?.

需要记住的一件事是,增加主要版本主要是为了打破公共 API 的向后兼容性,这通常是更改现有代码而不是添加新代码。要记住的另一件事是每个依赖项都有自己的公共 API。

于 2013-12-17T10:56:38.400 回答