Java 21 新特性:记录类与模式匹配

Java 21 引入了两项重要特性:记录类(Record Classes)和模式匹配(Pattern Matching),显著提升了代码的简洁性和表达力。以下是详细解析:

一、记录类(Record Classes)

记录类是一种透明数据载体,用于简化不可变数据模型的声明。其核心特性:

  1. 自动生成方法
    编译器自动生成:

    • 全参数构造方法
    • equals()hashCode()
    • toString()
    • 组件访问器(如 name()
  2. 声明语法
    使用 record 关键字定义:

    public record User(String name, int age) {}
    

  3. 使用示例

    User user = new User("Alice", 30);
    System.out.println(user.name()); // 输出 "Alice"
    System.out.println(user);       // 输出 "User[name=Alice, age=30]"
    

  4. 不可变性
    所有字段均为 final,禁止继承其他类(但可实现接口)。


二、模式匹配(Pattern Matching)

模式匹配通过解构数据简化类型检查和转换,主要应用于两个场景:

1. instanceof 模式匹配
  • 传统方式
    if (obj instanceof String) {
        String s = (String) obj;
        System.out.println(s.length());
    }
    

  • Java 21 改进
    直接绑定变量:
    if (obj instanceof String s) {
        System.out.println(s.length()); // 无需显式转换
    }
    

2. switch 模式匹配
  • 类型匹配
    Object obj = ...;
    switch (obj) {
        case Integer i -> System.out.println("整数: " + i);
        case String s  -> System.out.println("字符串长度: " + s.length());
        case null      -> System.out.println("空值");
        default        -> System.out.println("其他类型");
    }
    

  • 记录类解构
    结合记录类提取组件:
    record Point(int x, int y) {}
    
    Object obj = new Point(3, 4);
    switch (obj) {
        case Point(int x, int y) -> 
            System.out.println("坐标: (" + x + ", " + y + ")");
        default -> System.out.println("非坐标类型");
    }
    


三、核心优势
  1. 减少样板代码
    记录类消除 getter/setter 等重复代码。
  2. 增强类型安全
    模式匹配在编译时检查类型完整性。
  3. 提升可读性
    数据解构使逻辑更直观,例如:
    if (shape instanceof Circle c) {
        return $2 \pi r$ → $2 \times \pi \times c.radius()$;
    }
    

四、使用建议
  • 记录类适用场景:DTO、配置项等纯数据载体
  • 模式匹配适用场景:处理异构数据类型(如解析JSON/AST)
  • 注意事项:记录类不可变,需确保组件类型本身不可变

通过这两项特性,Java 21 使开发者能更专注于业务逻辑,减少冗余代码,同时保持类型系统的严谨性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐