向枚举添加值时的 Semver

Posted

技术标签:

【中文标题】向枚举添加值时的 Semver【英文标题】:Semver when adding values to enums 【发布时间】:2013-10-14 09:43:28 【问题描述】:

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

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

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

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

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

按照同样的逻辑,这将波及wsprovider.jarwsconsumer.jar 中的一个重大突破。

annotations.jar 需要大版本升级吗?

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于向枚举添加值时的 Semver的主要内容,如果未能解决你的问题,请参考以下文章

Jackson - 动态添加枚举值时,EnumValues 序列化失败

仅当定义了值时才向对象添加属性

concurrentPerform UnsafeMutablePointer.deinitialize 向数组添加值时出错

在 Firestore 中存储字典值时的逻辑问题

向 DataSource 添加值时,带有 CollectionView 的 IBDesignable 崩溃

向 Firebase 实时数据库添加新值时如何保存当前日期/时间