java向后兼容吗_Java向后不兼容历史的观察

java向后兼容吗

在大多数情况下,Java是一个非常向后兼容的编程语言。 这样做的好处是,与大规模破坏兼容性相比,大型系统通常可以相对轻松的方式升级为使用Java的较新版本。 这样做的主要缺点是Java坚持了一些设计决策,这些决策自那时以来就被认为比理想情况要差,但必须留在原处以保持一般的向后兼容性。 即使Java与向后兼容性有相当强的联系,但Java的每个主要版本中仍存在差异,这些差异可能会在升级时破坏基于Java的应用程序。 这些可能发生的中断(最常见于“拐角事件”中)是本文的主题。

Sun Microsystems和Oracle提供了与Java升级相关的兼容性问题的相当详细的概述。 我的观点不是要涵盖所有版​​本中的所有这些问题,而是要强调随Java的每个主要发行版引入的一些关键的不兼容性问题,这些问题要么对我个人造成影响,要么对其他人产生更大影响。 这篇文章底部的链接提供给Sun / Oracle Java版本的兼容性文档,以帮助那些寻求更大范围的读者。

升级

事后看来,Java的这一早期发行版修复了实现与规范的一些不兼容性也就不足为奇了。 例如, JDK 1.2兼容性参考指出,在1.1版本中实现的String哈希函数与Java语言规范第一版中指定的函数不匹配,并且实际上是无法实现的。” 它补充说,“已实现的函数在某些类别的字符串上执行得非常差”,并解释说,实现了“ 1.2版中新的String哈希函数”是为了“使实现符合规范并解决性能问题。” 尽管可以预料到对String.hashCode()的更改不会影响大多数应用程序,但是,人们公认“具有依赖于实际String哈希值的持久性数据的应用程序……理论上可能会受到影响。” 提醒您,依赖对象的hashCode()方法返回特定代码通常不是一个好主意。

升级

JDK 1.3兼容性参考提到了一些更改,这些更改带来了更多与JDK规范的实现一致性。 这样的一个例子是引入了“类型和子包之间的名称冲突”的更改:


根据…Java语言规范,…包中包含类或接口类型以及具有相同名称的子包是非法的。 在1.3版之前,几乎从未执行过此规则。 现在,新的编译器将一致地执行此规则。 如果在类路径或源路径上可以访问相应的目录,源文件或类文件,则不管其内容如何,​​都可以认为包,类或接口存在。

JDK 1.3还对“方法java.lang.Double.hashcode的实现”进行了更改。

升级

由于JDK 1.4的更改,我在一个项目上升级到JDK 1.4的升级工作最终花费的时间比估计的时间长,因此“编译器现在拒绝从未命名空间中导入类型的导入语句。” 换句话说,JDK 1.4取消了导入定义而无需显式包的类的功能。 我们没有意识到这对我们来说将是一个问题,因为它所影响的代码是由第三方工具生成的代码。 我们没有控制代码的生成以强制生成的类位于命名包中,因此它们自动成为“未命名名称空间”的一部分。 这意味着,使用JDK 1.4,我们将无法再将这些生成的类与我们自己的源代码一起编译 。 发现并解决此更改花费的时间比我们预期的要长,或者我们认为这将是相对简单的JDK版本升级。 当一个人控制代码时,同一JDK 1.4兼容性参考也指出了最合适的解决方案:“将所有类从未命名的名称空间移到命名的名称空间。”

升级

我在上一篇文章“ 关于避免对toString()Result进行解析或基于逻辑的美德”中写过Java SE 5对BigDecimal.toString()的更改。 Java SE 5兼容性参考只是指出:“ J2SE 5.0 BigDecimaltoString()方法的行为与早期版本不同。”

升级到Java SE 6时,最让我困扰的问题是JDK 6中包含JAXB 。 Java SE 6兼容性参考中未列出此问题,因为此问题的性质在技术上不符合此处记录的兼容性问题的定义。 但是,在迁移到Java SE 6之前使用单独下载的JAXB JAR的任何人都可能遇到了我遇到的类加载器问题 。 我们大多数人过去用来解决此问题的解决方案是将首选的JAXB JAR放置在指定的目录中,该目录是Java认可的标准替代机制的一部分 ( 从Java 8开始不推荐使用, 在Java 9中已删除 )。

升级

升级到Java 7时, com.sun.image.codec.jpeg软件包的任何使用都被中断。Java 7兼容性参考指出,“ com.sun.image.codec.jpeg软件包已在JDK 1.2中添加(1998年12月)。作为控制JPEG格式图像文件的加载和保存的非标准方式 。 该软件包从不属于平台规范的一部分,已从Java SE 7发行版中删除。 Java Image I / O API已作为标准API添加到JDK 1.4版本中,从而不再需要com.sun.image.codec.jpeg package 。”

Java 7中重新引入的另一个不兼容性实际上是使实现更好地符合规范的另一个示例。 在这种情况下,在Java SE 6中,具有基本相同的已删除签名但具有不同返回类型的方法被视为两种不同的方法。 这不符合规范,Java 7对此进行了修复。 关于此问题的更多详细信息,请参见我的博客文章NetBeans 7.1的Internal Compiler和JDK 6尊重方法重载的返回类型以及Java 7兼容性参考中 “摘要”标题下的内容:类无法定义相同擦除的两个方法签名,但有两种不同的返回类型”和“编译器不允许使用具有相同擦除签名的非重写方法”。

Java 7升级也为Substance用户带来了一些困难。 非实质性6.2版本的帖子指出:“ Java 7修复– Java的颜色选择器中的一个错误修复破坏了6.1的实质。 这个问题在Substance 6.2中已修复,因此现在应该可以在Java 7上运行!” 破坏了Substance的JDK 7更改已在许多地方记录,包括具有Substance外观的JColorChooser,Java 7 , ColorChooser在具有JDK7的JSlider中导致NullPointerException以及颜色选择器setColor在Java 7中不起作用 。

升级

就像Java 7的更改影响了实质性的一样,Java 8带来的更改也直接影响了几个流行且广泛使用的Java库。 尽管此更改可能直接影响了相对较少的Java应用程序,但它间接地有可能影响许多Java应用程序。 幸运的是,这些Java库的维护人员倾向于快速解决此问题。 这是另一个实施规范的例子,该规范被严格化(更正)并破坏基于无法正确实施规范的实现而起作用的事物。 在这种情况下,更改/更正在字节码验证程序中。 《 JDK 8兼容性指南》指出:“当指令引用实例初始化方法(“ <init> ”)时,invokespecial指令的验证已加强。 Niv Steingarten的博客文章Oracle最新的Java 8更新破坏了您的工具—它是如何发生的?

升级

Java 9似乎会引入一些重大的向后兼容性问题 ,尤其是考虑到模块化的引入。 虽然这些破损是什么尚待观察,但最初的提议已经引起了轩然大波 ,该提议取消了对sun.misc.Unsafe的访问。 这是另一个示例,其中官方不支持的API可能不会被大多数应用程序直接使用,而是可能被众多应用程序间接使用 ,因为它们依赖的库和产品都在使用它。 有趣的是,这引起了Mark Reinhold的提议 ,即将内部API封装在JDK 9中。考虑到与主要Java版本之间删除和更改的内部API相关的众多兼容性问题,这似乎是个好主意。

  • 避免利用违反规范的不正确实现,因为在更改实现以强制执行规范时,实现中的漏洞利用可能根本不起作用。
  • 提防并谨慎使用任何宣传为试验性或在将来的Java版本中删除的API,类和工具。 这包括sun。*软件包以及不建议使用的工具和API。
    • 我喜欢提议的“将内部API封装在JDK 9中”的JDK 9方法来解决主要版本升级中的这些常见问题。
  • 不要依赖 toString()实现返回的String来实现程序逻辑。

结论

多年来,为了保持Java在很大程度上向后兼容,已经进行了大量的努力。 但是,在某些情况下不能保持这种向后兼容性。 我在这篇文章中看了一些例子,并从这些例子中提取了一些观察和教训。 当开发人员避免使用已弃用的功能,避免使用实验性功能以及避免使用非标准功能时,向Java新版本的迁移往往会更容易。 此外,某些编码实践(例如避免将逻辑基于toString()结果)也可以提供帮助。

资源

  • Oracle / Sun Java版本兼容性指南(按相反顺序)
    • JDK 8兼容性指南
  • 其他相关资源
    • 升级主要Java版本(7至8)

翻译自: https://www.javacodegeeks.com/2016/06/observations-history-java-backwards-incompatibility.html

java向后兼容吗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转义字符的整理

文章目录转义符号 \转义字符清单换行符横向制表符空格编码符转义符号 \ 反斜杠\在程序设计中称为转义符&#xff0c;用来表示那些不能直接显示的字符。例如&#xff1a;换行。 在不同的系统中换行的表示又不相同&#xff0c;在Unix中换行符是\n,而在Windows中换行符是\r\n&…

cloud foundry_介绍“又一个” Cloud Foundry Gradle插件

cloud foundry在与两个同事&#xff08;感谢Mark Alston和Dave Malone &#xff01;&#xff09;一起使用自动Jenkins管道部署Cloud Foundry应用程序的过程中&#xff0c;我决定尝试编写Gradle插件来执行一些通常需要完成的任务使用命令行Cloud Foundry Client完成 。 引入一个…

C++ 11 深度学习(十八)模板概念,函数模板定义、调用

模板作为一个框架&#xff0c;通过传入的参数&#xff0c;来具体实例化想要的东西。 1.模板定义是用template关键字开头的&#xff0c;后跟<>,<>里面叫模板参数列表(模板实参)&#xff0c;如果模板参数列表中有多个参数使用逗号隔开。 2.<>里面至少要有一个…

kotlin将对象转换为map_Kotlin 集合框架:常用集合工具函数(Map 部分)

kotlin.collections.Maps.kt 文件定义了许多针对 Map 接口的工具函数&#xff0c;其中大多数是涉及函数式编程的高阶函数&#xff0c;我们在这里先不讲&#xff0c;等到集合框架结束后进入高阶函数时再讲。今天只讲几个简单的函数。Pair 类和 to() 函数Map 接口表示一种“键 -&…

Oracle/MySQL/Java数据类型对应表

文章目录数据类型对照表MySQL 的 int、bigint、mediumint、smallint、tinyint 的对比关于 MySQL 整型显示位数的问题关于 MySQL 的 timestamp关于 JDBC 类型数据类型对照表 MysqlOracleJavaBIGINTNUMBER(19,0)java.lang.LongBITRAWbyte[]BLOBBLOB RAWbyte[]CHARCHARjava.lang.…

java10个基础错误_我们处理了10亿个Java记录的错误-这是导致97%的错误的原因

java10个基础错误97&#xff05;的记录错误是由10个唯一错误引起的 在2016年&#xff0c;一件事在30年内没有改变。 开发和运营团队仍依靠日志文件对应用程序问题进行故障排除。 由于某些未知原因&#xff0c;我们隐式信任日志文件&#xff0c;因为我们认为事实隐藏在其中。 如…

MySQL的索引学习

文章目录索引自动创建索引手动创建索引删除索引使用索引单列索引PRIMARYNORMALUNIQUEFULLTEXT组合索引&#xff08;复合索引/联合索引&#xff09;索引不足之处索引使用注意事项索引方式 Hash 和 BTree 比较删除索引索引 数据库的索引就像一本书的目录&#xff0c;能够加快数据…

aptx与ldac音质区别_蓝牙协议LDAC和aptx的区别?

LDAC技术的功能介绍LDAC是索尼研发的一种无线音频编码技术&#xff0c;它最早在2015年的CES消费电子设备大展上亮相。在当时&#xff0c;索尼表示比起标准的蓝牙编码、压缩系统&#xff0c;LDAC技术要高效三倍之多。这样一来&#xff0c;那些高解析度的音频文件在进行无线传输的…

【音视频安卓开发 (九)】使用AudioRecord录制PCM音频

1.需要添加权限 <uses-permission android:name"android.permission.CAMERA" /><uses-permission android:name"android.permission.FLASHLIGHT" /><uses-permission android:name"android.permission.CAMERA" /><uses-per…

结果集 tostring_关于避免对toString()结果进行解析或基于逻辑的美德

结果集 tostring使用Java或我使用过的其他编程语言&#xff0c;我发现有时候可以用该语言完成某些事情&#xff0c;但通常不应该这样做。 通常&#xff0c;这些误用语言似乎无害&#xff0c;当开发人员首次使用它们时可能是有益的&#xff0c;但后来同一位开发人员或另一位开发…

3制造数据集_基于MBD的产品设计制造技术研究

本篇节选自论文《基于MBD的产品设计制造技术研究》&#xff0c;发表于《中国电子科学研究院学报》第8卷第6期&#xff0c;作者为中国电子科技集团公司第14研究所专家朱建军。本文经授权转载自公众号学术plus&#xff0c;版权归原作者所有。作者&#xff1a;中国电子科技集团公司…

JSP文件如何转换成Java文件?

文章目录jsp 文件如何转换成 java 文件jsp 何时开始编译jsp 编译后的文件存储目录jsp 文件如何转换成 java 文件 html ----> service(),使用 out.write()输出。 java代码片段 <% %> ----> service(),照…

【WebRTC---源码篇】(九)媒体协商

1.媒体协商的过程 2. 重要的接口类 3.时序图 4.几个关键点 5.code if (InitializePeerConnection()) {peer_id_ = peer_id;//参数1:观察者,创建成功后回调OnSuccess//参数2:消息类型,自动推导peer_connection_->CreateOffer(this, webrtc::PeerConnectionInterface::RTCOff…

jpa 使用jdbc_在JPA和JDBC中使用存储过程。 嗯,只要使用jOOQ

jpa 使用jdbcJava杂志的当前版本由Josh Juneau撰写了有关JDBC和JPA的大数据最佳实践的文章&#xff1a; http : //www.javamagazine.mozaicreader.com/MayJune2016 本文介绍了如何在JDBC中使用存储过程&#xff08;不幸的是&#xff0c;请注意如何关闭资源。即使在Java Magazi…

JSP文件中Java代码的几种形式(JSP脚本)

文章目录第一种形式&#xff08;Java 代码片段&#xff09;第二种形式&#xff08;JSP 表达式&#xff09;第三种形式&#xff08;JSP 声明&#xff09;第四种形式&#xff08;JSP 指令&#xff09;第一种形式&#xff08;Java 代码片段&#xff09; 原样复制到 service() 方法…

【WebRTC---源码篇】(七)NACK的处理流程

NACK调用栈 从分发器接收Packet包 void RtpVideoStreamReceiver::ReceivePacket(const RtpPacketReceived& packet) {if (packet.payload_size() == 0) {// Padding or keep-alive packet.// TODO(nisse): Could drop empty packets earlier, but need to figure out how…

java实现资源监视器_实现Java监视的12个步骤程序存在缺陷

java实现资源监视器Java监视的当前状态最大的问题是什么&#xff1f; 生产中的错误很像喝醉的短信。 您只有在事情已经发生之后才意识到出了点问题。 发短信日志通常比应用程序错误日志更有趣&#xff0c;但是……两者可能同样难以修复。 在本文中&#xff0c;我们将执行一个…

QT之QML布局相关总结

使用QML有助于提高界面编写效率&#xff0c;对付界面开发来说&#xff0c;页面如何布局是一个绕不开的点&#xff0c;本文总结一下QML中常用的一些和布局相关的内容。 目录 1.手动定位 2.坐标绑定定位 3.锚定位 4.布局定位器 5.布局管理器 6.其他布局相关 6.1 弹簧功能…

bpmn2 vue 设计器_vue项目中使用bpmn-基础篇

后退前进下载style"display: inline-block;":file-list"fileList"class"upload-demo"action"":auto-upload"false":show-file-list"false":http-request"httpRequest":on-change"handleOnchangeFi…