【问题标题】:what is the general java API compatibility rule什么是通用的 java API 兼容性规则
【发布时间】:2016-03-18 05:43:49
【问题描述】:

详细: 如果我们使用公共 API,例如编写 java 程序,在 JDK 1.4 中,如果应该在它上面的所有版本中正确运行。在 1.4、1.5、1.6 和 1.7 的所有更新版本中?

另外,不同更新版本之间的可组合性规则是什么,例如1.6.22和1.6.23什么不能改变,什么可以改变? 当然,公共 API 定义不能更改,其他的呢?文档?内部 API 定义、实现?

如果有人能指出一个关于这个主题的具体官方文件,那就太好了。谢谢,

在 java 文档中存在一个错误示例,他们不打算在更新程序版本之间进行更改。见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6475885

这应该是它的大图之一,但我们最好对此有一个完整的描述。

需要了解完整的故事,以便我们安全地升级到更大的版本。

【问题讨论】:

    标签: java backwards-compatibility


    【解决方案1】:

    一般规则是针对 Java X 的 API 编写和编译的任何代码应该在 Java Y 上运行,其中Y >= X

    偶尔会有例外;例如其中应用程序的行为取决于 Java X 中的一些未记录的行为(通常是错误),这些行为已在更高版本中得到纠正。

    AFAIK,没有单独的文档列出这些不兼容性。所有 Java 主要版本的发行说明都包含可能导致旧代码损坏的更改列表。

    话虽如此,谨慎的做法是确保在升级到更新的 Java 版本时彻底测试/重新测试您的软件。如果您的软件已交付给客户/客户,请告知他们是否/何时可以安全升级,并(如有必要)为他们提供针对您的测试发现的任何问题的修复。


    需要了解完整的故事,以便我们安全地升级到更大的版本。

    感到安全是无关紧要的。在更高版本上彻底测试您的应用程序。这是唯一实用的解决方案。如果每一个不兼容性都被详尽地记录下来,即使也是如此。

    考虑一下。您如何确定您的应用程序不会受到更改 XYZ 的影响?或者您使用的某些第 3 方库不会受到影响?答:不能。

    在这里抱怨你认为 Oracle 应该以不同的方式处理这个问题不会有任何不同。并不是说我认为他们可以在不改变商业模式的情况下更好地处理这个问题。您愿意为保证不存在版本兼容性问题的 Java 平台支付多少费用?

    【讨论】:

    • 应该有一些更一般的规则。 else ,否则升级一个庞大的软件将需要很多努力,尤其是在没有 ART 的情况下。 (让我们排除新版本引入的毫无根据的错误,因为每个软件都可能有错误,java本身也是如此)
    • Java X 中的一个错误可能会在以后的版本中得到修复。但是在软件中,它可以解决该错误。但是随着后来的 Java 修复它,它使解决方法本身成为一个错误。
    • @Ben Xu - 你太不切实际了。新 Java 版本故意破坏向后兼容性的唯一情况是没有真正的选择。
    • @Ben Xu,Sun/Oracle 已经有一段时间没有提供对 Java 1.4 或 Java 5.0 的免费支持了。如果您为业务支持付费,他们可能会帮助您解决您可能遇到的兼容性问题。 (但不要指望所有东西都是免费的;)
    【解决方案2】:

    这不是一个完整的答案,但我会补充说 will-it-run 和 will-it-compile 是两个不同的东西。 1.5 中引入的关键字将阻止某些 1.4 代码编译,但字节码可以正常运行。

    【讨论】:

    • 所以你的意思是在1.4写的一些java代码不能在1.5编译。但是他们编译的字节码可以在1.5 jre中运行吗?如果有这样的例子,那就太好了。谢谢
    • @Ben Xu,创建一个名为enum 的变量或字段。这将在 Java 1.4 上编译并在 Java 5.0 上运行,但不会在 Java 5.0 中编译。
    • @BenXu - 我的意思不是粗鲁,但这个答案并没有回答您实际提出的任何问题。您询问了 API 兼容性,而这个问题根本没有提到 API。当您接受一个答案时,您是在告诉其他发现您的问题的人,您认为这是他们正在阅读的问题的最佳答案......问。
    【解决方案3】:

    几乎任何东西都可以在不同版本之间进行更改,这些东西没有固定的规则。使用发行说明发布更改或在版本之间查看更改,例如:

    http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html

    通常只有错误​​修复是次要版本的原因(例如您详细介绍了 1.6.22 - 1.6.23),或者只是好的东西的简单增强。当主要版本号发生变化时,您可以期待更多的主要变化,但您仍然“希望”实现反向兼容性。

    【讨论】:

      【解决方案4】:

      我认为 JDK 不会更改破坏向后可比性的 API(除非是无意的)。

      他们在一开始就引入了@deprecated 标签,可能认为他们将来可能需要做一些 API 清理。但这永远不会发生。从未删除过任何@deprecated API,也没有改变行为。

      【讨论】:

        【解决方案5】:

        如果我们使用公共API,例如编写java程序,在JDK 1.4,如果在它上面的所有版本中都应该正确运行。在 1.4、1.5、1.6 和 1.7 的所有更新版本中?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 2013-02-05
          • 1970-01-01
          • 2016-12-14
          • 1970-01-01
          • 2011-07-19
          • 2018-04-19
          相关资源
          最近更新 更多