☰
Java9中2个被废弃的使用方法
2026/10/1 20:45:44 网站建设 项目流程

背景

在openjdk官网有一些废弃方法的解释:

https://cr.openjdk.java.net/~iris/se/9/latestSpec/api/deprecated-list.html

今天介绍用的较多的2种。解决大家被要求做代码坏味道整改时不知所以然的问题。

Class.newInstance()方法被弃用

类的实例化有以下6种方式:

用new语句创建对象,这是最常见的创建对象的方法。

使用Class静态方法 Class.forName 方法

使用 .loadClass() 方法

使用newInstance方法

运用反射手段,调用java.lang.Class的newInstance()实例方法。如:Object obj = Class.forName(“java.lang.Object”).newInstance();

调用对象的clone()方法。

无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法

使用反序列化

通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

但是第3种方法Class.newInstance()方法在Java9中被弃用,不过不用担心有替代方案:

可调用Class类的getDeclaredConstructor()方法:查看getDeclaredConstructor()的源码发现,该方法可以传入类类型的可变参数,应该是根据传入的参数类型去调用相应的构造方法,而以前只能调用无参构造器。

咱们先做个试验:

Version类的构造器要传入2个参数。实例化方法如下:

如果使用默认的方法进行实例化会抛出方法不存在异常:

使用Java9推荐的方法可以在编译期避免问题:

BigDecimal方法被重构

Java9中对BigDecimal做重构,纠正了之前不够专业的设计,功能并没有变化。但是会导致两种被废弃代码。

一种是下面的静态变量编程了枚举:

新枚举中的定义与原来不能说是十分相似,简直就是一模一样:

只是位置和名称不同:

与之对应的,原来是个int类型:

传参要改成枚举,对应的方法也被废弃,换成新的:

总结

从以上两个比较有代表性的废弃用例中咱们可以看出:用新方式替换是为了规范减少大家犯错的几率。对新增代码做严格要求我觉得没什么问题。但是很早之前写好的代码要全部改成新方式意义价值就没有那么大了。毕竟之前是经过生产长时间验证的稳定代码,变更才是更大的风险。主次还是要分清的。

编程一生

因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。

想知道自己错过了哪些更新,可参考我不定期更新的《系列文章分类汇总》。


有想进「编程一生」用户交流群的朋友吗?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询