当前位置: 代码网 > it编程>编程语言>Java > Java Record基本用法详解

Java Record基本用法详解

2025年07月01日 Java 我要评论
一、record 的诞生背景java 的 record(记录类)是 java 14 引入的预览特性,于 java 16 正式标准化。其设计初衷是简化不可变数据类的定义,解决传统 pojo 类中大量样板

一、record 的诞生背景

java 的 record(记录类)是 java 14 引入的预览特性,于 java 16 正式标准化。其设计初衷是简化不可变数据类的定义,解决传统 pojo 类中大量样板代码(如构造器、getter、equals、hashcode、tostring 等)的问题。例如,一个简单的 person 类在传统写法中需要 30+ 行代码,而用 record 只需一行。

传统类 vs record 类

// 传统 pojo(30+ 行)
public class person {
    private final int id;
    private final string name;
    // 构造器、getter、equals、hashcode、tostring...
}
// record 等效实现(1 行)
public record person(int id, string name) {}

通过 record,开发者可以专注于数据本身,而非重复的模板代码。

二、record 的核心特性

  1. 不可变性

    • record 的所有字段默认是 final 的,创建后不可修改,天然线程安全。
    • 适用于 dto、配置项等需要数据一致性的场景。
  2. 自动生成方法

    • 编译器自动生成以下方法:
      • 全参构造器
      • 字段访问器(如 id()name(),而非 getid()
      • equals()hashcode()tostring()
  3. 简洁语法

    • 使用 record 关键字定义,语法紧凑:
      public record point(int x, int y) {}
  4. 限制性设计

    • record 类是隐式 final 的,不可被继承。
    • 不能声明非静态实例字段(仅允许通过参数列表定义字段)。

三、record 的基本用法

1. 定义与实例化

public record user(string username, string email) {}
// 实例化
user user = new user("alice", "alice@example.com");
system.out.println(user.username()); // 输出 "alice"

2. 自定义方法

record 允许添加自定义方法:

public record circle(double radius) {
    // 计算面积
    public double area() {
        return math.pi * radius * radius;
    }
}

3. 参数校验(紧凑构造器)

通过紧凑构造器实现字段校验:

public record email(string address) {
    public email {
        if (!address.contains("@")) {
            throw new illegalargumentexception("invalid email");
        }
    }
}

4. 实现接口与泛型

record 可以实现接口,支持泛型:

public record pair<t, u>(t first, u second) implements serializable {
    public string tojson() {
        return "{ \"first\": \"" + first + "\", \"second\": \"" + second + "\" }";
    }
}

四、record 的进阶应用

  1. 替代 dto/vo

    • 快速定义 api 响应模型:
      public record apiresponse<t>(int code, string message, t data) {}
  2. 模式匹配(java 17+)

    • 结合 instanceof 解构数据:
      object obj = new point(3, 4);
      if (obj instanceof point(int x, int y)) {
          system.out.println("坐标: (" + x + ", " + y + ")");
      }
  3. 数据库映射

    • 简化 jdbc 结果集处理:
      try (resultset rs = statement.executequery()) {
          return new user(rs.getint("id"), rs.getstring("name"));
      }
  4. 函数式编程

    • 作为轻量级元组(如 pairtriple):
      record pair<a, b>(a first, b second) {}
      list<pair<string, integer>> pairs = list.of(new pair<>("java", 1995));

五、record 与 lombok 的对比

特性recordlombok
不可变性默认支持需手动添加 final
代码生成语言原生支持依赖注解处理器
模式匹配完全兼容不支持
兼容性需 jdk 16+兼容旧版本
可变性不可变支持可变类(如 @data

选择建议

  • 优先 record:需不可变类、使用模式匹配或 jdk 16+ 环境。
  • 选择 lombok:需可变类或兼容旧代码。

六、注意事项

  1. 不可继承性

    • record 不能继承其他类(隐式继承 java.lang.record)。
  2. 字段限制

    • 所有字段必须通过参数列表声明,不支持动态添加实例字段。
  3. 序列化

    • 需显式实现 serializable 接口。
  4. 框架兼容性

    • 部分框架(如旧版 spring)可能需适配 record 类型。

七、未来展望

  • 模式匹配增强:与 sealed class 结合,构建更严格的类型系统。
  • 框架整合:spring 等框架或默认支持 record 作为数据载体。
  • 函数式扩展:与 stream、optional 深度结合,提升代码表现力。

总结

java record 通过极简语法和不可变性,显著减少了数据类的样板代码,同时提升了代码安全性和可维护性。其适用于 dto、模式匹配、函数式编程等场景。

到此这篇关于java record基本用法详解的文章就介绍到这了,更多相关java record内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com