写点什么

JDK14 新增关键字——record

作者:FunTester
  • 2024-04-26
    河北
  • 本文字数:1317 字

    阅读完需:约 4 分钟

简介

JDK 14 引入了记录,这是一种新的类型声明。像 enum 一样,记录是类的受限形式。它非常适合于纯数据载体,即包含不打算更改的数据并且只包含最基本的方法(如构造函数和访问函数)的类。


注意:这是一个预览功能,它的设计、规范和实现都是完整的,但不是永久性的,这意味着该功能可能以不同的形式存在,或者在未来的 JDK 版本中根本不存在。若要编译和运行包含预览功能的代码,必须指定其他命令行选项。


下面是一个普通的 Java 类:


final class FunTester {
final String name;
final int age;
public FunTester(String name, int age) { this.name = name; this.age = age; }
public String name() { return name; }
public int age() { return age; }
}
复制代码


它具有以下特点:


  • 它的所有成员都被宣布为最终成员

  • 它唯一的方法包括一个构造函数和两个访问属性的方法


我们可以用一个 record 来替换这个类:


record FunTester(String name, int age) { }


record 有以下几个特点:


  • 每个组件的私有 final 字段。

  • 每个组件的公共读访问器方法,方法名与属性名一致。

  • 一个公共构造函数,其签名从记录组件列表中派生。

  • equals() 和 hashCode() 方法的实现,如果两个 record 对象属于同一类型且其对应的记录属性相等,则指定这两个记录相等。

  • toString() 方法的一个实现件的字符串表示及其名称。

紧凑型构造函数

如果我们想记录的构造函数不仅仅是初始化属性值,那么可以为记录定义一个自定义构造函数。然而,与类构造函数不同,记录构造函数没有正式的参数列表;这被称为紧凑构造函数。


例如,下面的 record FunTester ,我们想在构造函数里面校验属性值,可以用下面这种语法,虽然我们没有显式写出赋值代码,但是这些代码实际是会生效。


record FunTester(String name, int age) {    public FunTester {        if (age < 0) {            throw new IllegalArgumentException("年龄不能为负数");        }        Objects.requireNonNull(name, "名字不能为空");    }}
复制代码

record 的限制

以下是对 record 使用的限制:


  • record 不能扩展任何类

  • final记录不能声明实例字段;任何其他声明的字段必须是 static

  • record 不能是抽象的;他们隐含地final

  • record 的属性是 final


除了这些限制之外,记录的行为与常规类相同。除此之外 java.lang.Class 有两个与记录相关的新方法:


  • RecordComponent[] getRecordComponents():返回一个数组 java.lang.reflect.RecordComponent 对象,对应于记录的组件。

  • boolean isRecord():与此类似 ,只是如果类被声明为记录则 isEnum()返回。true


演示代码如下:


public static void main(String[] args) {      FunTester fun = new FunTester("FunTester", 25);// 创建record对象      boolean record = fun.getClass().isRecord();// 判断是否是record      System.out.println(record);// true      RecordComponent[] recordComponents = fun.getClass().getRecordComponents();// 获取所有的组件      for (RecordComponent recordComponent : recordComponents) {          System.out.println(recordComponent.getName());// name, age      }  }
复制代码

发布于: 刚刚阅读数: 4
用户头像

FunTester

关注

公众号:FunTester,800篇原创,欢迎关注 2020-10-20 加入

Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester

评论

发布
暂无评论
JDK14新增关键字——record_FunTester_InfoQ写作社区