在枚举中添加值时的Semver

时间:2013-10-07 17:39:59

标签: java semantic-versioning

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

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

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

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

在我看来,util.jar需要突破主要版本,因为API会以破坏现有代码的方式发生变化。

按照相同的逻辑,这将会导致wsprovider.jarwsconsumer.jar中出现重大冲击。

annotations.jar是否需要重大版本?

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

然而,本能地,对于枚举添加单个值似乎有点多,并且具有相当大的连锁效应。

我想这只是我们需要习惯的semver?

1 个答案:

答案 0 :(得分:1)

在您的情况下添加新功能(如添加新的枚举常量)很少会破坏公共API的向后兼容性。我认为它可能对公共API造成的最大伤害是使一些其他枚举常量不推荐使用,这只会导致SemVer中指定的次要版本崩溃(FAQ:我应该如何处理弃用功能?)。所以你可能想重新考虑一下,如果添加新的枚举常量确实会破坏现有的代码,因为我看不出它是怎么回事。

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

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