Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 清理代码会破坏二进制兼容性_Java_Versioning_Checkstyle_Binary Compatibility - Fatal编程技术网

Java 清理代码会破坏二进制兼容性

Java 清理代码会破坏二进制兼容性,java,versioning,checkstyle,binary-compatibility,Java,Versioning,Checkstyle,Binary Compatibility,我正在做一个项目,这个项目被很多我不认识的人使用。我们在降低CheckStyle警告方面做了相当好的工作,并且在不破坏二进制兼容性的情况下,它将达到一个较低的级别 其余大多数警告是由常量(publicstaticfinal)缺少final关键字引起的。这些常量的命名清楚地表明,开发人员希望它们是只读的,但它们只是没有最终定义 除非开发人员正在编写一些非常糟糕的代码来利用这种疏忽,否则如果我们添加它们,他们的代码不会崩溃 目前版本号为1.2.1。您是将更改应用到2.0,还是将其应用到1.3。看起来

我正在做一个项目,这个项目被很多我不认识的人使用。我们在降低CheckStyle警告方面做了相当好的工作,并且在不破坏二进制兼容性的情况下,它将达到一个较低的级别

其余大多数警告是由常量(publicstaticfinal)缺少final关键字引起的。这些常量的命名清楚地表明,开发人员希望它们是只读的,但它们只是没有最终定义


除非开发人员正在编写一些非常糟糕的代码来利用这种疏忽,否则如果我们添加它们,他们的代码不会崩溃

目前版本号为1.2.1。您是将更改应用到2.0,还是将其应用到1.3。看起来需要一个完整的2.0版本是一个很小的改变


我该怎么办?

我相信您已经知道了这一点,但我怀疑这必须归结为“这是一个安全/简单/无忧”的升级吗

  • 点释放被认为是安全和常规的。它们应该完全由一些项目中的bug修复组成。其他项目将包括新功能,如果它们不太可能导致问题
  • 新的主要版本发布包含可能需要适应的进化变化
  • 高级用户认为新的主要x.0版本发行版非常可疑:-)
我认为这还取决于你离下一个主要版本有多近。如果很快,不要冒险发布有问题的点。你总是可以做一个安全点版本和一个alpha主要版本,但是如果下一个主要版本是未来的出路,这可能会很奇怪


除非开发人员正在编写一些非常糟糕的代码来利用这种疏忽,否则如果我们添加它们,他们的代码不会崩溃

比如创建以前非最终类的子类,这些子类将不再工作

我认为它应该是2.0,并且您应该保持对1.x系列的支持


此外,这里还有一个关于API的有趣视频:“Joshua Bloch,Java核心库的创建者,现在正在Google上工作,我说打破它们。”。如果你是一个变异的静态,那么你必须知道你做错了。但是,您可能希望将其分为不同的版本,以便客户端有机会(无论是否接受)顺利升级,而不是因为需要其他不相关的修复而惊慌失措。

在我看来,此类可能破坏二进制兼容性的更改应该推迟到发布主要版本。也就是说,您的问题不应该是“我应该使用什么版本号”,而是“我应该在什么时候进行这些更改”

如果您完全致力于二进制兼容性,那么应该将这些更改推迟到包含重大改进的版本,以证明升级成本是合理的。例如,KDE项目对主要发行版提出了二进制兼容性要求。这意味着在该版本的生命周期内的任何改进都不能破坏针对旧版本编译的应用程序。因此,希望清理代码的开发人员必须等到下一个主要版本

一旦你准备好发布一个主要的版本及其所有漂亮的新特性,继续进行你认为必要的二进制兼容性更改,在这种情况下,如果有什么东西坏了,也就不足为奇了


如果你想变得聪明,你可以实现一个预处理器并编译代码两次,一次带韵母,一次不带韵母。这可以作为通往真正决赛的垫脚石,但同时维护成本也会很高。

“除非开发人员正在编写一些利用这种疏忽的非常糟糕的代码。”-或者可能是为了解决设计糟糕的API问题?@mmyers:我想知道你是如何推断它与java相关的:-?@Oscar Reyes:说出另一种语言,它的常量关键字为
final
。缺少final的不是类,而是常量。你可以停止对那些静态属性的修改。例如,您可能会破坏如下内容:
if(YourClass.intField++>1){…