Java 18 至 21 中的弃用功能 - Sip of Java
Billy Korando,2023 年 12 月 17 日
在 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()
更新类以实现 Closeable
或 AutoCloseable
,并将释放资源的行为移动到 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
编码愉快!