关于 java-21
面向 Java 21 应用和库开发的编码技能,介绍不可变数据、封闭类型层次及虚拟线程等实践,适用于编写和设计代码。
主要功能
- 01使用 record 表示不可变数据
- 02用紧凑构造器验证数据
- 03通过密封类型和模式匹配建模
- 04用虚拟线程处理阻塞 I/O
- 05避免可变 DTO 和逐请求平台线程
适用场景
- 01设计不可变 DTO 或值对象
- 02建模封闭的类型层次
- 03扩展阻塞 I/O 任务处理
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gentleman-programming/ gentleman-skills --skill java-21安装后在 Claude Code 中输入/java-21确认已加载。
详细介绍
适用场景
加载此技能的场景:
- 编写 Java 21 应用或库代码
- 设计不可变 DTO 或值对象
- 使用密封类型对封闭层次结构建模
- 使用虚拟线程处理阻塞 I/O
关键模式
模式 1:使用 Record 表示不可变数据
使用 Record 表示 DTO 和值对象,并在紧凑构造函数中进行验证。
模式 2:密封类型 + 模式匹配
使用密封接口/类和 switch 模式匹配,确保覆盖所有情况。
模式 3:使用虚拟线程处理 I/O
使用虚拟线程处理阻塞 I/O,无需创建大型线程池。
代码示例
示例 1:带验证的 Record
package com.acme.user;
public record Email(String value) {
public Email {
if (value == null || !value.contains("@")) {
throw new IllegalArgumentException("Invalid email");
}
}
}
示例 2:密封层次结构 + switch 模式匹配
package com.acme.payment;
public sealed interface Payment permits Card, BankTransfer { }
public record Card(String last4) implements Payment { }
public record BankTransfer(String iban) implements Payment { }
public final class PaymentPrinter {
public String describe(Payment payment) {
return switch (payment) {
case Card card -> "card-" + card.last4();
case BankTransfer bank -> "iban-" + bank.iban();
};
}
}
示例 3:使用虚拟线程处理阻塞调用
package com.acme.io;
import java.util.concurrent.Executors;
public final class Fetcher {
public void fetchAll(java.util.List<String> urls) throws Exception {
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (String url : urls) {
executor.submit(() -> blockingFetch(url));
}
}
}
private void blockingFetch(String url) {
// perform blocking I/O here
}
}
反模式
不要:使用可变数据载体
// BAD: mutable DTO
public class UserDto {
public String name;
public String email;
}
不要:为每个请求启动原始平台线程
// BAD: expensive and unbounded
new Thread(() -> blockingFetch("https://api" )).start();
快速参考
| 任务 | 模式 |
|---|---|
| 不可变 DTO | 使用带验证的 Record |
| 封闭层次结构 | 使用密封接口 + switch |
| 扩展处理阻塞 I/O | 使用虚拟线程执行器 |
资源
评论
支持 Markdown