前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK14新增关键字——record

JDK14新增关键字——record

作者头像
FunTester
发布2024-04-28 15:15:22
1280
发布2024-04-28 15:15:22
举报
文章被收录于专栏:FunTesterFunTester

简介

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

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

下面是一个普通的Java类:

代码语言:javascript
复制
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 ,我们想在构造函数里面校验属性值,可以用下面这种语法,虽然我们没有显式写出赋值代码,但是这些代码实际是会生效。

代码语言:javascript
复制
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

演示代码如下:

代码语言:javascript
复制
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  
    }  
}

FunTester原创专题推荐~

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-25,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 紧凑型构造函数
  • record的限制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com