Java SE 16 record 类型说明与使用

2023-11-11

Java SE 16 record 类型说明与使用

作者:Grey

原文地址:

博客园:Java SE 16 record 类型说明与使用

CSDN:Java SE 16 record 类型说明与使用

说明

record 是 Java SE 16 的新特性

record 的使用场景

假设我们想创建一个不可变的类 Point,它有 x 和 y 的坐标。我们想实例化Point对象,读取它们的字段,并将它们存储在 List 中或在 Map 中作为键值使用。

我们可以这样实现 Point 类

public class Point {

    private final int x;
    private final int y;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Point point = (Point) o;

        if (x != point.x) return false;
        return y == point.y;
    }

    @Override
    public int hashCode() {
        int result = x;
        result = 31 * result + y;
        return result;
    }

    @Override
    public String toString() {
        return "Point{" + "x=" + x + ", y=" + y + '}';
    }

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }


    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

如上代码中重复写了很多模板代码,使用 Lombok,代码可以简化成如下方式

@AllArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
public class Point {
  private final int x;
  private final int y;
}

现在有了 record 上述所有代码可以简化为

public record Point(int x, int y) {}

使用javac Point.java && javap Point,我们可以查看到 Point 反编译后的结果

public final class Point extends java.lang.Record {
  public Point(int, int);
  public final java.lang.String toString();
  public final int hashCode();
  public final boolean equals(java.lang.Object);
  public int x();
  public int y();
}

和我们最初始的 Point 类定义是一样的,所以 record 可以大量简化代码的编写。

我们可以像正常使用类一样使用 record

示例代码

public class App {
    public static void main(String[] args) {
        Point p = new Point(3, 4);
        int x = p.x();
        int y = p.y();
        System.out.println(x + " " + y);


        Point p2 = new Point(3, 4);
        Point p3 = new Point(7, 5);

        System.out.println(p2.equals(p)); // 输出 true
        System.out.println(p2.equals(p3)); // 输出 false
    }
}

record 可以通过如下方式来实现多构造函数

public record Point(int x, int y) {
    public Point() {
        this(3, 3);
    }

    public Point(int v) {
        this(v, v + 3);
    }
}

record 中可以包括 static 类型变量,示例如下

public record Point(int x, int y) {
    private static final int ZERO = 0;
    private static long count = 0;

    public Point() {

        this(ZERO, ZERO);
        synchronized (Point.class) {
            count++;
        }
    }
    public static synchronized long getCount() {
        return count;
    }
    public Point(int v) {
        this(v, v + 3);
    }
}

如果要覆盖 record 的默认构造函数,则函数入参一定要和 record 的入参保持一致,否则会报错

正确

public record Point(int x, int y) {
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

错误

public record Point(int x, int y) {
    public Point(int m, int n) {
        this.x = m;
        this.y = n;
    }
}

record 中可以自定义非 static 方法,例如

public record Point(int x, int y) {
    public double distanceTo(Point target) {
        int dx = target.x() - this.x();
        int dy = target.y() - this.y();
        return Math.sqrt(dx *dx + dy* dy);
    }
}

调用方法

public class App {
    public static void main(String[] args) {
        Point from = new Point(17, 3);
        Point to = new Point(18, 12);
        double distance = from.distanceTo(to);
        System.out.println(distance);
    }
}

record 也可以实现接口,但是无法继承类

正确


public record Point(int x, int y) implements WithXCoordinate {}

public interface WithXCoordinate {
    int x();
}

错误

public record Point(int x, int y) extends WithXCoordinate {}

public class WithXCoordinate {
    int x(){}
}

record 也无法被其他类继承,例如

错误

public record Point(int x, int y)  {}

public class WithXCoordinate extends Point{
    int x(){}
}

源码

hello-record

参考文档

Java Records

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java SE 16 record 类型说明与使用 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 简单人脸检测

    1 1 Haar特征分类器介绍 Haar特征分类器就是一个XML文件 该文件中会描述人体各个部位的Haar特征值 包括人脸 眼睛 嘴唇等等 Haar特征分类器存放目录 D wsbSoft Anaconda3 envs tensorflow
  • 通过adbshell获取android的权限集合

    在Window控制台中输入如下命令可以看到Android系统中列出的所有权限 如果自定义权限注册成功 在这里也会找到这些自定义的权限 adb shell pm list permissions html view plain copy C
  • 解决Tomcat中POST方式传送参数大小限制问题

    之前我在做项目的时候遇到了这个问题 Tomcat是使用POST的方式发送请求参数 请求参数有九万多个 点击提交就没有反应了 后来查询资料知道了是请求参数过多了 超过了Tomcat的上传文件最大值2M 通过以下方法进行修改后解决了问题 在to
  • 云上城之个服务器维护时间,云上城之歌时间之塔开服时间表_云上城之歌新区开服预告_第一手游网手游开服表...

    今日开服 15 00 三十八区苍炎之门 已经开服 2021 08 10 10 00 三十八区巨石林野 已经开服 2021 08 09 15 00 三十八区荧光要塞 已经开服 10 00 三十八区雷神圣所 已经开服 2021 08 07 10
  • 基于Java的Cplex入门

    Cplex是一种数学优化技术 主要用于提高效率 快速实现策略并提高收益率 Cplex提供灵活的高性能优化程序 解决线性规划 Linear Programming 二次方程规划 Quadratic Programming 二次方程约束规划 Q
  • vue与C#实现自定义表单审批流程构建-前端

    vue与C 实现自定义表单审批流程构建 做信息化项目相信绝大部分人都接触过单据审批流程的需求 例如发起一个采购申请 需要几个节点审核 部门负责人审核 采购审核 财务审核等等 审批人也需要可自定义 以及可能会出现审批条件分支的情况 这时我们的
  • 织梦DEDECMS网站后台系统菜单点击没有反应的解决办法(除了核心)

    织梦DEDECMS模板网站后台系统菜单点击没有反应的解决办法 DEDECMS模板 问题说明 织梦系统的后台主页右上角一直是 载入中 而左边的系统菜单 这里指的是切换菜单 点击没有任何反应 只能在 核心 菜单中使用 其他的 模块 生成 采集
  • ENVI:如何进行图像融合?

    目录 有话要说 什么是图像融合 图像融合的方法以及特点 图像融合有什么好处 ENVI实操 1 1 加载需要融合的图像文件 1 2 搜寻工具并点击打开 Gram schmidt方法 1 3 输入低分辨率的多光谱图像文件 1 4 输入高分辨率的
  • msys2使用QT的mingw编译器编译ffmpeg

    使用的时候最好关闭杀毒软件 否则configure和make会很慢 window编译ffmpeg mingw 要在windows搭建一个模拟linux环境 下载安装MSYS2 64 网址 https www msys2 org 我这里安装在
  • linux中git安装步骤,linux配置安装 git 详细教程

    Git是目前流行的非常好用的版本控制工具 这里介绍两种安装方式 1 yum安装 2 从github上下载最新的源码编译后安装 一 环境介绍 系统 linux 镜像 CentOS 7 x86 64 DVD 1804 iso 二 源码安装 1
  • linux中命令du -sm,Linux中的Du命令

    du命令是 disk usage 的缩写 展示文件或目录使用的估计磁盘空间量 这对于查找占用大量磁盘空间的文件和目录很有用 如何使用du命令 du命令的常规语法如下 du OPTIONS FILE 如果给定的FILE是目录 du则将汇总该目
  • hibernate 根据实体类自动生成表

    常规的思路是 设计好数据库 建好表 借助MyEclipse 也可以是其他IDE 自动生成映射 或者自己写映射 早就听说hibernate中可以自动生成表 但是一直没有试验 今天首先介绍其中的一个属性hbm2ddl auto 这个就是这个方案
  • 与老范对谈:ChatGPT等AIGC技术对内容产业的影响和趋势判断

    昨日 我和老范线下面基 用一下午的时间深入探讨了AIGC对内容产业影响的话题 这次聊天收获满满 我迫不及待将这次讨论的内容整理成了文章 但在这之前 请让我先介绍一下老范 老范曾就职于盛大创新院 猎豹移动 是Tiktok的早期投资人 是一名互
  • 手里有几万块能做什么副业?一万块钱搞什么副业

    最近几年来 兼职 副业已经成为大家的刚需了 否则上班的收入已经满足不了开支了 我相信很多人手上都有1万元或者2万元左右甚至更多的闲钱 那么 有闲钱可以干什么 手上有一万元能投资做什么 1 做微商 微商可以说是近些年最热门的职业之一了 你既可
  • IDEA常用配置之代码自动格式化删除无用导入

    文章目录 IDEA常用配置之代码自动格式化删除无用导入 配置步骤 安装google java format 安装Save Actions 自动优化导包选项 检查行分隔符 缩进大小 IDEA常用配置之代码自动格式化删除无用导入 配置步骤 安装
  • Mac安装brew

    终极方法 不需要代理 百分百成功运行 bin zsh c curl fsSL https gitee com cunkai HomebrewCN raw master Homebrew sh 运行结果如下
  • AD 多边形 圆形 快速覆铜

    1 先确认你的板框 如下图 在Keep Out Layer 层 使用shift S键隐藏其他的层 2 全选板框 按T G M 输入法英文状态下 或手动选择 工具 多边形填充 多边形管理器 进入下图状态 选择图上标志的地方 选择板外形 如下图
  • 机器学习 day35(决策树)

    决策树 上图的数据集是一个特征值X采用分类值 即只取几个离散值 同时也是一个二元分类任务 即标签Y只有两个值 上图为之前数据集对应的决策树 最顶层的节点称为根节点 椭圆形节点称为决策节点 矩形节点称为叶子节点 决策树学习算法的工作是 在所有
  • Jetson Nano 40 pin 功能介绍

    40 根引脚主要分成GPIO General Purpose I O 通用功能与SFIO Special Function I O 特定功能 一 SFIO 18根 1 5V 直流电输入 输出 脚位 2 4 在排针脚塑料使用 红色 标识 2根
  • Java SE 16 record 类型说明与使用

    Java SE 16 record 类型说明与使用 作者 Grey 原文地址 博客园 Java SE 16 record 类型说明与使用 CSDN Java SE 16 record 类型说明与使用 说明 record 是 Java SE