Java9中2个被废弃的使用方法
背景
在openjdk官网有一些废弃方法的解释:
https://cr.openjdk.java.net/~iris/se/9/latestSpec/api/deprecated-list.html今天介绍用的较多的2种。解决大家被要求做代码坏味道整改时不知所以然的问题。
Class.newInstance()方法被弃用
类的实例化有以下6种方式:
用new语句创建对象,这是最常见的创建对象的方法。
1. 使用Class静态方法 Class.forName 方法
2. 使用 .loadClass() 方法
3. 使用newInstance方法
运用反射手段,调用java.lang.Class的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance();
4. 调用对象的clone()方法。
无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法
5. 使用反序列化
6. 通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
但是第3种方法Class.newInstance()方法在Java9中被弃用,不过不用担心有替代方案:
可调用Class类的getDeclaredConstructor()方法:查看getDeclaredConstructor()的源码发现,该方法可以传入类类型的可变参数,应该是根据传入的参数类型去调用相应的构造方法,而以前只能调用无参构造器。
咱们先做个试验:
Version类的构造器要传入2个参数。实例化方法如下:
如果使用默认的方法进行实例化会抛出方法不存在异常:
使用Java9推荐的方法可以在编译期避免问题:
BigDecimal方法被重构
Java9中对BigDecimal做重构,纠正了之前不够专业的设计,功能并没有变化。但是会导致两种被废弃代码。
一种是下面的静态变量编程了枚举:
新枚举中的定义与原来不能说是十分相似,简直就是一模一样:
只是位置和名称不同:
与之对应的,原来是个int类型:
传参要改成枚举,对应的方法也被废弃,换成新的:
总结
从以上两个比较有代表性的废弃用例中咱们可以看出:用新方式替换是为了规范减少大家犯错的几率。对新增代码做严格要求我觉得没什么问题。但是很早之前写好的代码要全部改成新方式意义价值就没有那么大了。毕竟之前是经过生产长时间验证的稳定代码,变更才是更大的风险。主次还是要分清的。