Java Record(记录类)是Java 14引入、Java 16正式标准化的特殊类类型,旨在简化不可变数据模型的定义,解决传统POJO类中大量样板代码的问题。以下是其核心要点:


⚙️ 一、核心特性

  1. 不可变性

    • 所有字段默认为final,创建后无法修改,天然线程安全。

    • 示例:record Point(int x, int y) {},尝试修改x会触发编译错误。

  2. 自动生成方法

    • 编译器自动生成以下方法:

      • 全参构造器:参数与声明字段一一对应。

      • 字段访问器:如x()y()(非getX())。

      • equals()hashCode()toString():基于字段值实现逻辑。

  3. 简洁语法

    • 一行代码替代传统30+行POJO类:

      // Record定义
      public record Person(String name, int age) {}
      
      // 传统POJO等效代码(需手动编写构造器、getter、equals等方法)
      public class Person { 
          private final String name; 
          private final int age;
          // 冗长的样板代码...
      }
      

🚫 二、设计限制

  1. 不可继承性

    • 隐式继承java.lang.Record,不能继承其他类。

  2. 字段限制

    • 仅能通过参数列表声明字段,不能添加非静态实例字段

  3. 构造器约束

    • 支持紧凑构造器(无参数列表)进行校验,但不可重载默认构造器:

      public record Email(String address) {
          public Email { // 紧凑构造器
              if (!address.contains("@")) throw new IllegalArgumentException();
          }
      }
      

⚡️ 三、适用场景

  1. 数据传输对象(DTO)

    • 替代传统POJO,简化API请求/响应模型:

      public record ApiResponse<T>(int code, String message, T data) {}
      
  2. 值对象(Value Object)

    • 表示领域模型中的不可变数据,如配置项、坐标等。

  3. 模式匹配(Java 17+)

    • 结合instanceof解构数据:

      Object obj = new Point(3, 4);
      if (obj instanceof Point(int x, int y)) {
          System.out.println(x + ", " + y); // 输出:3, 4
      }
      
  4. 函数式编程

    • 作为轻量级元组(如PairTriple)。


⚖️ 四、与传统类的对比

特性 Record类 传统类
目的 不可变数据载体 通用业务逻辑
样板代码 自动生成(减少90%代码量) 需手动编写或依赖Lombok
字段修改 ❌ 禁止 ✅ 支持
继承 ❌ 仅能实现接口 ✅ 可继承其他类
适用版本 JDK 16+ 全版本兼容

⚠️ 五、注意事项

  1. 版本依赖:需JDK 16+,低版本项目无法使用。

  2. 复杂逻辑不适合包含业务逻辑(如状态修改),仅限数据存储。

  3. 框架兼容性:旧版Spring等框架可能需要适配序列化/反序列化逻辑。

  4. Lombok对比

    • Record优势:语言原生支持、模式匹配兼容性。

    • Lombok优势:支持可变类、低版本JDK兼容。


💎 总结

Record类的本质是语法糖,通过编译器自动生成模板代码,将开发者从冗余的getter/setter中解放,专注于数据模型设计。适用于DTO、配置类、值对象等纯数据场景,但在需要继承、字段可变性或复杂业务逻辑时,仍需使用传统类或Lombok。

Logo

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

更多推荐