java-21

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

When 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

速查表

TaskPattern
Immutable DTOsUse records with validation
Closed hierarchiesUse sealed interfaces + switch
Blocking I/O scaleUse virtual threads executor
任务模式
不可变DTO使用带验证的records
封闭层级使用sealed接口 + switch
阻塞式I/O扩容使用virtual threads执行器

Resources

参考资源