Java 18 至 21 中的弃用功能 - Sip of Java

在 Java 18 至 21 之间添加了许多新功能,但一些功能也即将退出。让我们回顾一下一些已被弃用或删除的关键功能及其替代方案!

终结

在 Java 18 至 21 期间被弃用的最大功能是弃用终结以进行删除。此更改是 Java 18 的一部分,并在 JEP 421 中进行了介绍。

终结自 1.0 以来一直是 Java 的一部分,但从未按预期工作。造成这种情况的原因有很多,如果您感兴趣,请务必阅读 JEP,其中还包括终结无法正常工作的一些实际后果。

有几种选择可以为您的应用程序准备终结删除。

第一个也是最直接的方法是使用命令行选项关闭终结:--finalization=disabled。这将关闭所有终结器,甚至 JDK 本身中的终结器。如果您的应用程序没有遇到任何问题,那么您的工作可能已经完成。

如果您遇到一些问题,JDK Flight Recorder (JFR) 已更新为新的 jdk.FinalizerStatistics 事件,用于跟踪对 finalize() 的调用。像这里一样启用 JFR

$ java -XX:StartFlightRecording:filename=recording.jfr ... 

并使用以下命令打印 jdk.FinalizerStatistics 实例

jfr print --events FinalizerStatistics recording.jfr

这可以提供可能需要更改的起步点。如果删除 finalize() 的更改在您的代码中,则需要考虑几个选项。

考虑使用 finalize() 更新类以实现 CloseableAutoCloseable,并将释放资源的行为移动到 close()。这将确保在离开 try-with-resources 块时立即释放资源

try(MyCloseableResource res = new MyCloseableResource(){
	...
}

如果此方法不起作用,请考虑使用 JDK 9 中添加的 Cleaner API。Rodger Riggs 撰写了一篇 精彩的文章,介绍如何使用 Cleaner API。

语言环境

在 JBS 问题 JDK-8282819 中介绍了 java.util.Locale 的构造函数在 JDK 19 中已弃用。应改用静态工厂方法选项。

最直接的替换将是 .of 方法

  • 语言环境 Locale.of(String)
  • 语言环境 Locale.of(String, String)
  • 语言环境 Locale.of(String, String, String)

还有

  • 语言环境 Locale.forLanguageTag(String)

以及 Locale.Builder

发出有关移除 COMPAT 提供程序的警告 (JDK-8304982)

在 JDK 9 中,Java 已从使用 COMPAT 转为使用 CLDR 作为区域设置数据的默认值;此更改在 JEP 252 中进行了介绍。JBS 问题 JDK-8304982 规定,当使用 COMPAT 时将发出警告。COMPAT 的移除可能最早在 JDK 22 中进行。

移除 JAR 索引功能 (JDK-8302819)

JAR 索引功能已在 JDK 21 中移除。JAR 索引功能是一种旧优化,主要用于使小程序受益,而小程序也同样即将淘汰。JAR 索引功能没有替代品,并且在使用 -i--generate-index 时将发出警告。

请参阅:JDK-8302819

编码愉快!