Java9中2个被废弃的使用方法 - 编程一生

Java9中2个被废弃的使用方法 - 编程一生

💡 原文中文,约1300字,阅读约需4分钟。
📝

内容提要

Java 9 弃用了 Class.newInstance(),因其只能调用无参构造器,推荐改用 getDeclaredConstructor(),后者支持传参并具备编译期检查;同时 BigDecimal 的部分 int 静态变量改为枚举,相关方法同步替换。作者认为新代码应遵循新规范,但稳定的旧代码不必强行整改,因为变更风险更大。

🔎

延伸解读

Class.newInstance() 弃用的实际影响

Class.newInstance() 只能调用无参构造器,且异常处理不透明,容易在运行时抛出 InstantiationException 或 IllegalAccessException。Java 9 弃用它,推荐使用 getDeclaredConstructor(),后者支持传入参数类型,能匹配带参构造器,并在编译期检查方法是否存在,减少运行时错误。对于已有代码,如果稳定运行且无重构需求,可以暂不修改,但新代码应优先采用新方式。

BigDecimal 静态变量改为枚举的兼容性

Java 9 将 BigDecimal 中原本的 int 静态变量(如 ROUND_HALF_UP)改为 RoundingMode 枚举,相关方法如 setScale(int, int) 被标记为废弃,推荐使用接收 RoundingMode 的重载。这一变化纠正了旧设计,功能不变,但旧代码若继续使用 int 常量,编译时会有警告。迁移时需将 int 参数替换为对应的枚举值,注意枚举名称与旧常量名可能不同。

旧代码是否必须整改?

作者认为,对于新增代码,遵循新规范能减少犯错几率,应严格要求;但对于已长期稳定运行的旧代码,全面替换为推荐方式的价值有限,因为变更本身可能引入风险。是否整改需权衡收益与风险,优先处理活跃维护的模块,而非盲目追求消除所有废弃警告。

❓

Q&A

Java 9 中为什么弃用了 Class.newInstance() 方法?

因为 Class.newInstance() 只能调用无参构造器,无法传递参数,且缺乏编译期检查,容易在运行时抛出异常。

Java 9 中 Class.newInstance() 的替代方法是什么?它有什么优点?

替代方法是 Class.getDeclaredConstructor()。它可以传入可变参数指定构造器参数类型,支持带参构造,并且能在编译期发现错误。

Java 9 对 BigDecimal 做了哪些重构?

Java 9 将 BigDecimal 中部分 int 静态变量改为了枚举,相关方法也被废弃并替换为使用枚举的新方法,但功能没有变化。

BigDecimal 中哪些静态变量被改成了枚举?

文章提到 BigDecimal 的部分 int 静态变量(如舍入模式相关的常量)被改成了枚举,新枚举的定义与原来一模一样,只是位置和名称不同。

对于旧代码,是否应该按照 Java 9 的新规范全部整改?

作者认为对新增代码严格要求是合理的,但旧代码如果已经过生产验证且稳定,不必强行整改,因为变更带来的风险更大。

Java 中创建对象有哪几种方式?

文章列举了6种:用 new 语句、Class.forName、.loadClass()、newInstance 方法、调用 clone() 方法、使用反序列化。

🏷️

标签

➡️

继续阅读