mcpField
J
java-21

java-21

github.com/gentleman-programming开发661326 次安装31 周前更新
代码仓库

关于 java-21

面向 Java 21 应用和库开发的编码技能,介绍不可变数据、封闭类型层次及虚拟线程等实践,适用于编写和设计代码。

主要功能

  1. 01使用 record 表示不可变数据
  2. 02用紧凑构造器验证数据
  3. 03通过密封类型和模式匹配建模
  4. 04用虚拟线程处理阻塞 I/O
  5. 05避免可变 DTO 和逐请求平台线程

适用场景

  1. 01设计不可变 DTO 或值对象
  2. 02建模封闭的类型层次
  3. 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