Java 21新特性有哪些?
笔记哥 /
04-13 /
39点赞 /
0评论 /
603阅读
Java 21 是 Java 语言的一次重要更新,引入了若干新的特性,提升了开发者的编程效率和代码质量。本文将详细介绍 Java 21 的新特性,包括基础概念、使用方法、常见实践以及最佳实践。
### 简介
随着 Java 语言的不断演进,Java 21 在语法、性能和并发模型上进行了多方面的改进。此次更新强调了代码可读性和简洁性,同时提升了并行编程的能力。新的特性帮助开发者更好地应用现代编程理念。
### Java 21 新特性概览
Java 21 带来了一系列增强功能,包括但不限于:
1. 模式匹配增强
2. 密封类扩展
3. 记录模式
4. 结构化并发
5. 虚拟线程
### 模式匹配增强
模式匹配在 Java 中越来越重要,这一模式使得 Java 语言的表达能力得到了极大增强。Java 21 中,模式匹配不仅限于 instanceof,还包括 **switch** 表达式的新能力。
```csharp
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。
```csharp
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语句的最后要加一个分号。
```csharp
private static void withReturnValue(Fruit fruit) {
String text = switch (fruit) {
case APPLE, PEAR -> "普通水果";
case MANGO, AVOCADO -> "进口水果";
default -> "未知水果";
};
System.out.println(text);
}
```
也可以直接省略赋值动作直接打印。
```csharp
private static void withReturnValue(Fruit fruit) {
System.out.println(switch (fruit) {
case APPLE, PEAR -> "普通水果";
case MANGO, AVOCADO -> "进口水果";
default -> "未知水果";
});
}
```
如果你想在case里想做不止一件事,比如在返回之前先进行一些计算或者打印操作,可以通过大括号来作为case块,最后的返回值使用关键字yield进行返回。
```csharp
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返回结果。
```csharp
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 中得到了更多的支持,允许开发者精细控制继承结构。
```csharp
public sealed class Shape permits Circle, Rectangle {
//...
}
public final class Circle extends Shape {
//...
}
```
#### 使用方法
密封类允许在类声明中明确指定哪些子类可以继承它,有助于控制类的层次结构。
#### 常见实践
适用于需要对子类集合做严格控制的业务场景,如几何形状、语法树等高级结构。
#### 最佳实践
- 搭配 **sealed**、**non-sealed** 和 **final** 关键字使用,增强类层次结构的可读性。
- 定义清晰、稳定的子类集合。
### 记录模式
记录模式提供了一种简洁定义不变数据携带类的方式,并且支持用于模式解析。
```csharp
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 引入了结构化并发,简化复杂的并发结构,提高代码的可维护性。
```csharp
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
Future future1 = executor.submit(() -> heavyComputation1());
Future future2 = executor.submit(() -> heavyComputation2());
Integer result1 = future1.get();
Integer result2 = future2.get();
System.out.println("Results: " + result1 + ", " + result2);
}
```
#### 使用方法
通过结构化并发,开发者能够在一个上下文内启动、管理和终结多个并发任务。
#### 常见实践
应用于需要并发执行的任务处理,如并行数据处理和批量计算。
#### 最佳实践
- 合理设计并发边界,确保线程资源有效分配和回收。
- 利用 try-with-resources 保证合集的自动关闭。
### 虚拟线程
虚拟线程是 Java 21 带来的革命性进展,允许大规模的轻量级线程操作,超越传统线程的限制。
```csharp
Thread.startVirtualThread(() -> {
System.out.println("Running in a virtual thread");
});
```
#### 使用方法
虚拟线程通过 Thread.startVirtualThread 创建,能够高效处理 I/O 密集型应用。
#### 常见实践
特别适用于高并发、 I/O 重的应用场景,如 web 服务器请求。
#### 最佳实践
- 使用虚拟线程作为默认并发模型,减少阻塞操作。
- 组合使用结构化并发,进一步强化模型的灵活性。
#### 小结
Java 21 为开发者提供了众多新特性,从语言结构到并发模型,提升了开发的效率和代码的简洁性。通过学习这些新特性,开发者能编写更具表现力和可维护性的代码,同时应根据具体需求合理选择应用场景。
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2216
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利
- 相关联分享
- Java 21新特性有哪些?