Java 6源代码的向后兼容性和SQL

9
我的理解是为了保持源代码的兼容性,Java从不向公共接口引入新方法,因为这会破坏实现接口的现有客户端。 Java Release notes 指出:

一般情况下,策略如下, 除了以下任何不兼容项:

  • 维护发行版(例如1.4.1、1.4.2)不会引入任何新的语言功能或API。它们将保持彼此之间的源代码兼容性。

  • 功能发行版和主要发行版(例如1.3.0、1.4.0、5.0)保持向上但不保持向下的源代码兼容性。

然而,包 java.sqljavax.sql 仍在不断发展,并引入许多不兼容的更改。例如,我注意到以下不兼容的更改(在Java 6中引入):

您知道这些方法是如何添加的以及为什么要添加吗?java.sql是否与平台的其余部分有所不同?您是否知道围绕这些添加的讨论/JSR?


添加方法不会破坏向上兼容性,只会破坏向下兼容性(这在主要版本发布时是被允许的,比如Java 6)。 - C. K. Young
但是 java.sql 类型是接口,而不是类。 - John Calsbeek
4个回答

9

我从一位Sun开发者那里得到了以下回复

JDK在功能发布(如JDK 7)中的API的一般演变政策是:

  1. 不破坏二进制兼容性(定义在JLSv3第13章中)
  2. 避免引入源代码不兼容性
  3. 管理行为兼容性更改

(想要了解更多关于不同兼容性类型的信息,可以查看"Kinds of Compatibility: Source, Binary, and Behavioral""Compatibly Evolving BigDecimal")

向接口添加方法是二进制兼容的,但源代码不兼容,因此通常不会这样做。一般来说,接口被广泛实现的程度越高,我们就越不可能向其添加方法。JDBC领域是这一政策的例外,并使用较宽松的升级规则,但这确实会在人们想要升级到新的JDK版本时带来真正的问题。


1
这应该是“不会引起实际问题”吗? - nafg

4
请注意,添加新方法只会破坏源代码兼容性,在JDBC驱动程序中已编译的StatementResultSet实现将继续在更新的JDK上运行。只有当您尝试调用新方法时,才会出现NoSuchMethodError

正确。这就是为什么我将问题限制在源代码兼容性上的原因! - notnoop
1
这是不正确的。它会破坏所有为Java 5实现的驱动程序。请参阅我的问题https://dev59.com/KEjSa4cB1Zd3GeqPIMVs - ZZ Coder
1
@张,所提到的问题涉及二进制向下兼容性;即在针对Java 5 JDK时使用Java 6 JDK。Java从未承诺过这一点! - notnoop

1

他们可能认为实现这些方法的数据库驱动程序供应商正在跟上新的Java运行时,并且引入有用的新方法并暂时破坏兼容性会更好。

当然,他们本可以设计得更好,以避免必须破坏兼容性...


1

太阳公司从不保证发布版本之间的源代码兼容性,只保证二进制兼容性。最常见的例子是包含“assert”或“enum”标识符的源代码将无法在JDK 1.4(对于assert)或1.5+(对于enum)下编译,但现有的.class文件仍将在这些更新的JVM下运行。

您可以尝试使用-source标志在较新的JVM下编译旧的.java文件,但如果依赖已更改的jvm类,则仍可能遇到问题。


并不完全正确。我在问题中附上了源代码兼容性策略。他们对于破坏源代码兼容性比二进制兼容性更加宽松,但通常会记录这些更改。java.sql的更改未在发行说明中记录。 - notnoop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接