Java 21 新特性
Java 21 是 Java 语言的一次重要更新,引入了若干新的特性,提升了开发者的编程效率和代码质量。本文将详细介绍 Java 21 的新特性,包括基础概念、使用方法、常见实践以及最佳实践。
简介
随着 Java 语言的不断演进,Java 21 在语法、性能和并发模型上进行了多方面的改进。此次更新强调了代码可读性和简洁性,同时提升了并行编程的能力。新的特性帮助开发者更好地应用现代编程理念。
Java 21 新特性概览
Java 21 带来了一系列增强功能,包括但不限于:
- 模式匹配增强
 - 密封类扩展
 - 记录模式
 - 结构化并发
 - 虚拟线程
 
模式匹配增强
模式匹配在 Java 中越来越重要,这一模式使得 Java 语言的表达能力得到了极大增强。Java 21 中,模式匹配不仅限于 instanceof,还包括 switch 表达式的新能力。
Object obj = getObject();
switch (obj) {
    case Integer i -> System.out.println("Integer: " + i);
    case String s -> System.out.println("String: " + s);
    default -> System.out.println("Unknown type");
}
可以通过switch表达式来进行简化。将冒号(:)替换为箭头(->),并且switch表达式默认不会失败,所以不需要break。
private static void withSwitchExpression(Fruit fruit) {
    switch (fruit) {
        case APPLE, PEAR -> System.out.println("普通水果");
        case MANGO, AVOCADO -> System.out.println("进口水果");
        default -> System.out.println("未知水果");
    }
}
switch表达式也可以返回一个值,比如上面的例子我们可以让switch返回一个字符串来表示我们要打印的文本。需要注意在switch语句的最后要加一个分号。
private static void withReturnValue(Fruit fruit) {
    String text = switch (fruit) {
        case APPLE, PEAR -> "普通水果";
        case MANGO, AVOCADO -> "进口水果";
        default -> "未知水果";
    };
    System.out.println(text);
}
也可以直接省略赋值动作直接打印。
private static void withReturnValue(Fruit fruit) {
    System.out.println(switch (fruit) {
        case APPLE, PEAR -> "普通水果";
        case MANGO, AVOCADO -> "进口水果";
        default -> "未知水果";
    });
}
如果你想在case里想做不止一件事,比如在返回之前先进行一些计算或者打印操作,可以通过大括号来作为case块,最后的返回值使用关键字yield进行返回。
private static void withYield(Fruit fruit) {
    String text = switch (fruit) {
        case APPLE, PEAR -> {
            System.out.println("给的水果是: " + fruit);
            yield "普通水果";
        }
        case MANGO, AVOCADO -> "进口水果";
        default -> "未知水果";
    };
    System.out.println(text);
}
当然也可以直接使用yield返回结果。
private static void oldStyleWithYield(Fruit fruit) {
    System.out.println(switch (fruit) {
        case APPLE, PEAR:
            yield "普通水果";
        case MANGO, AVOCADO:
            yield "进口水果";
        default:
            yield "未知水果";
    });
}
使用方法
引入的模式匹配允许在 switch 语句中进行更加复杂的匹配和操作。写法简洁,提高可读性。
常见实践
配合使用模式匹配,通常可用于解析复杂对象结构,增强代码灵活性。
最佳实践
- 使用模式匹配替代多重 if-else 判断,及声明break 返回。
 - 避免过于深层嵌套。
 
密封类扩展
密封类在 Java 21 中得到了更多的支持,允许开发者精细控制继承结构。
public sealed class Shape permits Circle, Rectangle {
    //...
}
public final class Circle extends Shape {
    //...
}
使用方法
密封类允许在类声明中明确指定哪些子类可以继承它,有助于控制类的层次结构。
常见实践
适用于需要对子类集合做严格控制的业务场景,如几何形状、语法树等高级结构。
最佳实践
- 搭配 sealed、non-sealed 和 final 关键字使用,增强类层次结构的可读性。
 - 定义清晰、稳定的子类集合。
 
记录模式
记录模式提供了一种简洁定义不变数据携带类的方式,并且支持用于模式解析。
record Point(int x, int y) {}
Point p = new Point(3, 4);
System.out.println("Point: " + p.x() + ", " + p.y());
使用方法
记录类自动生成了所有字段的访问器、equals()、hashCode()、toString() 方法,无需手动定义。
常见实践
用于数据传递的简单对象存储,避免重复代码。
最佳实践
- 适用于需要不可变数据的情况。
 - 记录类字段应尽量设计为私有和最终,保持其不可变特性。
 
结构化并发
Java 21 引入了结构化并发,简化复杂的并发结构,提高代码的可维护性。
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    Future<Integer> future1 = executor.submit(() -> heavyComputation1());
    Future<Integer> future2 = executor.submit(() -> heavyComputation2());
    Integer result1 = future1.get();
    Integer result2 = future2.get();
    System.out.println("Results: " + result1 + ", " + result2);
}
使用方法
通过结构化并发,开发者能够在一个上下文内启动、管理和终结多个并发任务。
常见实践
应用于需要并发执行的任务处理,如并行数据处理和批量计算。
最佳实践
- 合理设计并发边界,确保线程资源有效分配和回收。
 - 利用 try-with-resources 保证合集的自动关闭。
 
虚拟线程
虚拟线程是 Java 21 带来的革命性进展,允许大规模的轻量级线程操作,超越传统线程的限制。
Thread.startVirtualThread(() -> {
    System.out.println("Running in a virtual thread");
});
使用方法
虚拟线程通过 Thread.startVirtualThread 创建,能够高效处理 I/O 密集型应用。
常见实践
特别适用于高并发、 I/O 重的应用场景,如 web 服务器请求。
最佳实践
- 使用虚拟线程作为默认并发模型,减少阻塞操作。
 - 组合使用结构化并发,进一步强化模型的灵活性。
 
小结
Java 21 为开发者提供了众多新特性,从语言结构到并发模型,提升了开发的效率和代码的简洁性。通过学习这些新特性,开发者能编写更具表现力和可维护性的代码,同时应根据具体需求合理选择应用场景。
参考资料
Java 21 新特性的更多相关文章
- Java 8新特性探究(八)精简的JRE详解
		
http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...
 - Java 8新特性之旅:使用Stream API处理集合
		
在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...
 - [转帖]Java 8新特性探究(八)精简的JRE详解
		
Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api 撸了今年阿里.网易和美团的面试,我有一个重要发 ...
 - IBM Developer:Java 9 新特性概述
		
Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...
 - Java 8 新特性——检视阅读
		
Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...
 - Java 8 新特性——实践篇
		
Java 8 新特性--实践篇 参考 Java8新特性 重要更新:Lambda 表达式和Stream API Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的 ...
 - Java 8新特性-4    方法引用
		
对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法 ClassName :: staticMetho ...
 - Spring 4支持的Java 8新特性一览
		
有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...
 - java 8 新特性
		
最近在IDEA的️驱使下,看了点java8的东西,链接贴一下,,,,, 1.Java 8新特性概述2.Java 8中的 Stream API 详解[3.Java 8新特性终极指南] 简单的使用看完新特 ...
 - Java 8 新特性终极版
		
声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...
 
随机推荐
- react中refs的使用
			
1.在dom元素中直接使用ref 意思就是可以在组件中创建一个dom节点的textInput,并将ref直接绑定到他 <script src="https://unpkg.com/@b ...
 - SQL server 更改计算机名后造成未找到或无法访问服务器解决方法
			
默认的计算机名较长且不易辨识,我在更改完计算机名之后却发现每次登陆SQL server都需要更改计算机名并重启计算机,否则便会出现以下错误提示: 此时我们需要再次更改计算机名(最终你想给计算机起的名字 ...
 - 【译】.NET 升级助手现在支持升级到集中式包管理
			
原文 | McKenna Barlow 翻译 | 郑子铭 最近,.NET 升级助手引入了一些有用的新功能和一种新的中央包管理 (CPM) 升级类型. .NET 升级助手可帮助您将解决方案升级到较新版本 ...
 - 使用 SOUI 开发高 DPI 桌面应用程序[转载]
			
原文:使用 SOUI 开发高 DPI 桌面应用程序_吹泡泡的小猫的博客-CSDN博客 补充说明:soui3以后版本对dpi的支持更完善了,用起来也更简单了. 1 应用程序感知 DPI 变化 在 Win ...
 - FLink参数pipeline.operator-chaining介绍
			
1.当使用flink提交一个任务,没有给算子设置并行度情况下,默认所有算子会chain在一起,整个DAG图只会显示一个算子,虽然有利于数据传输,提高程序性能,但是无法看到数据的输入和疏忽,业绩反压相关 ...
 - CentOS7安装RabbitMQ (安装包安装)
			
环境: CentOS7 需要安装:erlang 22.2 rabbitmq 3.8.3 参考: rabbit官网地址:http://www.rabbitmq.com/which-erlang.htm ...
 - DeepSeek文本和编程测试
			
2025年春节期间,能直面电影<哪吒2>锋芒的,也就只有号称"国运级"的大模型DeepSeek了. 在科技圈里,这句话也可以反过来说. DeepSeek为什么能爆火,自 ...
 - Javascript 方法有多个参数有默认值,但是只想为其中某个参数赋值
			
例子: function log(a, b = 2, c = 3, d = 4) { console.log(a, b, c, d) } log(1); // output: 1 2 3 4 log( ...
 - iview weapp输入组件input事件顺序
			
做小程序,使用ivew weapp组件框架,同时用到了i-input和i-modal,更具体说,就是在modal里面放置了input,填写数据后点击确定,实现提交数据. 出现点小问题,发现是事件顺序导 ...
 - Ubuntu20.04 安装 .NET Core SDK
			
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-micr ...