Java 21 新特性之 弃用和移除

305 阅读4分钟

Java 21 在引入新特性和改进的同时,也对一些过时的功能进行了 弃用(Deprecation)移除(Removal) 。这是为了保持语言的现代化和简洁性,同时鼓励开发者采用更高效、更安全的替代方案。

以下是 Java 21 中被弃用或移除的主要功能:


1. 移除 ​​SecurityManager​

​SecurityManager​​​ 是 Java 平台中用于管理应用程序权限的一个组件。然而,随着现代安全管理技术的发展,​​SecurityManager​​ 的使用场景已经大幅减少,并且其设计在某些情况下可能会带来性能开销和复杂性。

影响:

  • ​SecurityManager​​ 和相关 API 已从 Java 21 中完全移除。
  • 如果你的代码依赖于 ​​SecurityManager​​,需要迁移到其他安全管理机制,例如基于策略的访问控制或容器化的安全模型。

示例:

以下代码在 Java 21 中将无法编译:

System.setSecurityManager(new SecurityManager());

2. 弃用 ​​Object.finalize()​

​Object.finalize()​​​ 方法长期以来被认为是不安全和不可靠的资源清理机制。它的执行时机不确定,并可能导致性能问题或资源泄漏。Java 官方推荐使用 ​​Cleaner​​​ 或 ​​PhantomReference​​​ 来替代 ​​finalize()​​。

影响:

  • ​Object.finalize()​​ 被标记为 弃用,并计划在未来版本中移除。
  • 使用 ​​finalize()​​ 的代码仍然可以运行,但会生成警告。

替代方案:

使用 ​​java.lang.ref.Cleaner​​ 进行资源清理:

import java.lang.ref.Cleaner;

public class Resource implements AutoCloseable {
    private static final Cleaner cleaner = Cleaner.create();
    private final Cleaner.Cleanable cleanable;
    private final ResourceCleaner resourceCleaner;

    public Resource() {
        this.resourceCleaner = new ResourceCleaner();
        this.cleanable = cleaner.register(this, resourceCleaner);
    }

    @Override
    public void close() {
        cleanable.clean();
    }

    private static class ResourceCleaner implements Runnable {
        @Override
        public void run() {
            System.out.println("Cleaning up resources...");
        }
    }
}

3. 移除 RMI 激活机制

远程方法调用(RMI)的激活机制允许对象在分布式环境中动态创建和激活。然而,这种机制的使用场景非常有限,并且容易引发安全问题。

影响:

  • RMI 激活相关的类和方法已从 Java 21 中移除。
  • 如果你的应用程序依赖于 RMI 激活机制,需要迁移到其他分布式计算框架(如 gRPC 或 RESTful API)。

示例:

以下代码在 Java 21 中将无法编译:

ActivationGroup group = ActivationGroup.getSystem();

4. 移除 ​​Applet API​

​Applet API​​​ 是 Java 平台早期用于开发嵌入式 Web 应用程序的接口。然而,随着浏览器对 Java 插件的支持逐渐消失,​​Applet API​​ 已经失去了实际用途。

影响:

  • ​Applet API​​ 及相关类已在 Java 21 中完全移除。
  • 如果你的项目依赖于 ​​Applet API​​,需要迁移到现代的 Web 技术(如 HTML5、JavaScript 或 WebAssembly)。

5. 弃用 ​​java.net.URL​​ 的默认构造函数

​java.net.URL​​ 的无参构造函数长期以来被认为是不必要的,并且容易引发混淆。Java 官方决定将其标记为弃用。

影响:

  • 以下代码将生成警告:
URL url = new URL(); // 弃用

替代方案:

明确指定协议、主机和路径来创建 ​​URL​​ 对象:

URL url = new URL("https://example.com");

6. 移除实验性的 AOT(Ahead-of-Time)编译支持

AOT 编译是 Java 平台的一项实验性功能,旨在通过提前编译 Java 字节码为本地代码来提高启动性能。然而,由于其复杂性和有限的适用场景,Oracle 决定不再继续支持该功能。

影响:

  • ​jaotc​​ 工具及相关 API 已从 Java 21 中移除。
  • 如果你需要类似的性能优化,可以考虑使用 GraalVM 或其他 AOT 编译工具。

7. 弃用 ​​Thread.stop()​​​、​​Thread.suspend()​​​ 和 ​​Thread.resume()​

这些线程控制方法长期以来被认为不安全,可能引发死锁或数据损坏。虽然它们早已被标记为弃用,但在 Java 21 中进一步强调了这一点。

影响:

  • 如果你的代码仍然使用这些方法,建议改用更安全的线程管理方式(如中断机制)。

示例:

以下代码将生成警告:

Thread thread = new Thread(() -> {});
thread.stop(); // 不安全

8. 移除 ​​javax.rmi.CORBA​​ 包

​javax.rmi.CORBA​​ 包是 Java EE 的一部分,用于支持 CORBA(Common Object Request Broker Architecture)。随着 Java EE 的独立化(更名为 Jakarta EE),这些包已被移除。

影响:

  • 如果你的项目依赖于 ​​javax.rmi.CORBA​​,需要迁移到现代的 RPC 框架(如 gRPC 或 RESTful API)。

9. 弃用 ​​java.rmi.server.UID​​​ 和 ​​java.rmi.server.ObjID​

这些类是 RMI 的底层实现细节,通常不直接由开发者使用。Java 官方决定将其标记为弃用。

影响:

  • 如果你的代码直接使用这些类,建议改用更高层的 RMI API 或其他分布式计算框架。

10. 其他小范围的弃用和移除

  • 移除​com.sun.security.auth.PolicyFile​​:这是一个内部实现类,从未被官方推荐使用。
  • 弃用​java.util.jar.Pack200​​:Pack200 是一种压缩工具,但由于其使用场景减少,已被标记为弃用。

总结

Java 21 的弃用和移除操作反映了 Java 平台不断演进的趋势。通过淘汰过时的功能,Java 能够更好地适应现代开发需求,同时鼓励开发者采用更高效、更安全的技术。