当前位置: 首页 > news >正文

Java中Record的应用

目录

核心特性

典型应用场景

与传统类对比

使用示例

注意事项


Record是Java 14引入的预览特性(Java 16正式发布),主要用于简化不可变数据载体的建模。其核心价值在于自动生成模板代码,替代传统POJO类的繁琐编写。

一、核心特性
  1. 自动生成方法
    编译器自动生成:

    • final字段的getter(方法名即字段名,无get前缀)
    • equals()hashCode()
    • toString()
    • 全字段构造器
  2. 不可变性
    所有字段默认为final,创建后状态不可修改。

  3. 语法结构

    public record 类名(类型1 字段1, 类型2 字段2...) { // 可选:自定义方法/构造器
    }
    

二、典型应用场景
  1. DTO数据传输对象

    public record UserDTO(String id, String name, LocalDateTime createTime) {}
    

  2. 多返回值方法
    替代Map或临时类:

    public record Coordinate(double x, double y) {}public Coordinate calculatePosition() {return new Coordinate(12.5, 8.3);
    }
    

  3. 模式匹配(Java 17+)
    配合instanceof简化类型判断:

    Object obj = new UserDTO("U001", "Alice", LocalDateTime.now());
    if (obj instanceof UserDTO(String id, String name, var time)) {System.out.println(name); // 直接解构字段
    }
    

三、与传统类对比
特性Record类传统POJO类
字段声明直接在括号内声明显式声明+getter/setter
不可变性默认强制需手动添加final
代码量平均减少70%模板代码冗长
继承隐式继承Record,不可继承其他类可自由继承
可变性扩展不支持可通过setter实现
四、使用示例
// 定义Record
public record Product(String sku, BigDecimal price,int stock
) {// 自定义紧凑构造器(验证逻辑)public Product {Objects.requireNonNull(sku);if (price.compareTo(BigDecimal.ZERO) < 0) throw new IllegalArgumentException("价格不能为负");}// 自定义方法public boolean isInStock() {return stock > 0;}
}// 使用
Product laptop = new Product("P1001", new BigDecimal("5999.00"), 10);
System.out.println(laptop.sku()); // 直接访问字段
System.out.println(laptop.isInStock());

五、注意事项
  1. 不适合需要可变状态的场景
  2. 不能继承其他类(但可实现接口)
  3. 字段默认private final,无法添加实例字段
  4. 可通过静态字段/方法扩展功能

在Java 21中,Record可配合密封接口(sealed interface)实现更安全的代数数据类型(ADT)设计,适用于领域驱动开发(DDD)中的值对象建模。

http://www.xdnf.cn/news/1300141.html

相关文章:

  • Java使用Apache POI读取Excel文件
  • Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)
  • C#WPF实战出真汁01--项目介绍
  • SpringBoot+Vue线上部署MySQL问题解决
  • 代码随想录Day50:图论(图论理论、深度搜索理论、所有可达路径、广度搜索理论)
  • Linux软件下载菜单脚本
  • 【数据分享】2014-2023年长江流域 (0.05度)5.5km分辨率的每小时日光诱导叶绿素荧光SIF数据
  • 【记录】Apache SeaTunnel 系统监控信息
  • 深度学习-卷积神经网络CNN-批量归一化 BatchNorm
  • PostgreSQL——触发器
  • 零基础-动手学深度学习-10.3. 注意力评分函数
  • 最新去水印小程序系统 前端+后端全套源码 多套模版 免授权(源码下载)
  • vue3,使用v-draggable拖动时卡顿的问题
  • 减重小知识
  • Linux 文件系统简介
  • OpenCV 形态学操作
  • GitHub 仓库代码上传指南
  • 开发避坑指南(26):Vue3 input输入框前置后 置元素解决方案
  • Mybatis学习笔记(三)
  • diffusers库学习--pipeline,模型,调度器的基础使用
  • springboot博客实战笔记02
  • C#WPF实战出真汁04--登录功能实现
  • C#WPF实战出真汁03--登录界面设计
  • 【React】hooks 中的闭包陷阱
  • 大数据项目_基于Python+hadopp的城市空气污染数据关联性可视化分析系统源码_基于机器学习的城市空气污染预测与分析系统的设计与实现
  • 04. study_ESP32配网库
  • 沈帅波出席茅台红缨子高粱节探讨产业赋能新模式
  • dkms安装nvidia驱动和多内核支持
  • B站 韩顺平 笔记 (Day 18)
  • 考研408《计算机组成原理》复习笔记,第五章(3)——CPU的【数据通路】