java-21
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseWhen to Use
使用场景
Load this skill when:
- Writing Java 21 application or library code
- Designing immutable DTOs or value objects
- Modeling closed hierarchies with sealed types
- Using virtual threads for blocking I/O
在以下场景中使用本技能:
- 编写Java 21应用程序或库代码
- 设计不可变DTO或值对象
- 使用sealed types建模封闭层级
- 使用virtual threads处理阻塞式I/O
Critical Patterns
核心模式
Pattern 1: Records for immutable data
模式1:用Records实现不可变数据
Use records for DTOs and value objects, validate in compact constructors.
将records用于DTO和值对象,在紧凑构造函数中进行验证。
Pattern 2: Sealed types + pattern matching
模式2:Sealed Types + 模式匹配
Use sealed interfaces/classes and switch pattern matching for exhaustiveness.
使用sealed接口/类与switch模式匹配以确保穷尽性。
Pattern 3: Virtual threads for I/O
模式3:用Virtual Threads处理I/O
Use virtual threads to handle blocking I/O without large thread pools.
使用virtual threads处理阻塞式I/O,无需庞大的线程池。
Code Examples
代码示例
Example 1: Record with validation
示例1:带验证的Record
java
package com.acme.user;
public record Email(String value) {
public Email {
if (value == null || !value.contains("@")) {
throw new IllegalArgumentException("Invalid email");
}
}
}java
package com.acme.user;
public record Email(String value) {
public Email {
if (value == null || !value.contains("@")) {
throw new IllegalArgumentException("Invalid email");
}
}
}Example 2: Sealed hierarchy + switch pattern matching
示例2:封闭层级 + Switch模式匹配
java
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();
};
}
}java
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();
};
}
}Example 3: Virtual threads for blocking calls
示例3:用Virtual Threads处理阻塞调用
java
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
}
}java
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
}
}Anti-Patterns
反模式
Don't: Use mutable data carriers
禁忌:使用可变数据载体
java
// BAD: mutable DTO
public class UserDto {
public String name;
public String email;
}java
// BAD: mutable DTO
public class UserDto {
public String name;
public String email;
}Don't: Spin up raw platform threads per request
禁忌:为每个请求创建原生平台线程
java
// BAD: expensive and unbounded
new Thread(() -> blockingFetch("https://api" )).start();java
// BAD: expensive and unbounded
new Thread(() -> blockingFetch("https://api" )).start();Quick Reference
速查表
| Task | Pattern |
|---|---|
| Immutable DTOs | Use records with validation |
| Closed hierarchies | Use sealed interfaces + switch |
| Blocking I/O scale | Use virtual threads executor |
| 任务 | 模式 |
|---|---|
| 不可变DTO | 使用带验证的records |
| 封闭层级 | 使用sealed接口 + switch |
| 阻塞式I/O扩容 | 使用virtual threads执行器 |
Resources
参考资源
- Java 21 Release Notes: https://www.oracle.com/java/technologies/javase/21-relnote-issues.html
- JEP Index: https://openjdk.org/jeps/0