Java中你绝对没用过的一个关键字Record的使用

 更新时间:2022年11月29日 22:35:49   作者:鸭血粉丝Tang  
这篇文章主要给大家介绍一个 Java 中的一个关键字 Record,那 Record 关键字跟不可变类有什么关系呢?看完今天的文章你就知道了,快跟随小编一起学习一下吧

前面的文章给大家介绍了如何自定义一个不可变类,没看过的小伙伴建议去看一下,这节课给大家介绍一个 Java 中的一个关键字 Record,那 Record 关键字跟不可变类有什么关系呢?看完今天的文章你就知道了。

友情提示 Record 关键字在 Java14 过后才支持的,所以是不是被阿粉说中了,还在使用 Java 8 的你一定没用过!

不可变类

我们先看一下之前定义的不可变类,代码如下。

package com.example.demo.immutable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public final class Teacher {
  private final String name;
  private final List<String> students;
  private final Address address;
  private final Map<String, String> metadata;

  public Teacher(String name, List<String> students, Address address, Map<String, String> metadata) {
    this.name = name;
    this.students = students;
    this.address = address;
    this.metadata = metadata;
  }

  public String getName() {
    return name;
  }

  public List<String> getStudents() {
    return new ArrayList<>(students);
//    return students;
  }

  public Address getAddress() {
//    return address;
    return address.clone();
  }

  public Map<String, String> getMetadata() {
    return new HashMap<>(metadata);
//    return metadata;
  }
}

如果你复制上面代码到 IDEA 中,并且刚好你的 JDK 版本是 Java14 之后的话,那么你就会看到下面这个提示,提示我们可以将 Teacher 这个不可变类转换为 Record。怎么样是不是很懵,没关系,我们按照提示操作一下看看会发生什么。

点完之后我们的代码会变成下面的样子

package com.example.demo.immutable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public record Teacher(String name, List<String> students, Address address, Map<String, String> metadata) {

  @Override
  public List<String> students() {
    return new ArrayList<>(students);
//    return students;
  }

  @Override
  public Address address() {
//    return address;
    return address.clone();
  }

  @Override
  public Map<String, String> metadata() {
    return new HashMap<>(metadata);
//    return metadata;
  }
}

仔细一看你会发现,这是什么情况,record 是什么关键字,然后类名后面怎么还有参数?乍一看还以为变成一个方法了。此外我们之前的测试代码不用修改任何逻辑,照样可以正常运行,是不是很神奇?这就是 Record 关键字的特性。

Record 关键字

看完了 Record 关键字的 case ,我们来聊一下 Record 关键字是怎么用的,以及它有什么特性。

  • Record 关键定义的类是不可变类;
  • Record 定义的类需要将所有成员变量通过参数的形式定义;
  • Record 定义的类默认会生成全部参数的构造方法;
  • Record 定义的类中可以定义静态方法;
  • Record 定义的类可以提供紧凑的方式进行参数校验;

上面的五点里面前三点我们在之前的例子中都可以看出来,在定义和使用的时候可以明显的看到,如下所示。

public record Teacher(String name, List<String> students, Address address, Map<String, String> metadata) {
}//1,2
 Teacher teacher = new Teacher("Java极客技术", students, address, metadata);//3

下面我们看下第四点和第五点,关于第四点我们可以在 Record 类中定义静态方法用来默认初始化对象,如下所示,通过这种方式我们可以写出更简洁的代码。

  public static Teacher of() {
    return new Teacher("Java极客技术", new ArrayList<>(), new Address(), new HashMap<>());
  }

  public static Teacher of(String name) {
    return new Teacher(name, new ArrayList<>(), new Address(), new HashMap<>());
  }

在使用的时候,我们就可以直接通过类名引用静态方法就可以了,如下所示

 Teacher teacher = Teacher.of();

接下来我们看看什么叫紧凑的方式进行参数校验,试想一下,如果我们需要校验在沟通 Teacher 对象的时候,student 成员变量不能为空,在我们以前的写法里面只要在构造方法里面进行一下判空就可以了,但是对于 Record 的形式,我们没有显示的创建构造方法,那我们应该如何进行判断呢?答案如下

  public Teacher {
    if (null == students || students.size() == 0) {
      throw new IllegalArgumentException();
    }
  }

可以看到我们通过一种紧凑的构造方法的形式来进行了参数的校验,这种写法跟我们普通的构造方法是不一样的,没有方法参数,怎么样是不是很神奇。

总结

有的人说 Java 的 Record 的新特性是为了让大家不使用 Lombok 的,阿粉倒是觉得不见得,毕竟 Lombok 用起来是真的香,而且 Record  也只能是定义不可变类,在某些情况下使用还是有局限性的,不可变类的使用场景并不是很多。

到此这篇关于Java中你绝对没用过的一个关键字Record的使用的文章就介绍到这了,更多相关Java关键字Record内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 2023最新版本idea用maven新建web项目(亲测不报错)

    2023最新版本idea用maven新建web项目(亲测不报错)

    这篇文章主要给大家介绍了关于2023最新版本idea用maven新建web项目,Maven是当今Java开发中主流的依赖管理工具,文中介绍的步骤亲测不报错,需要的朋友可以参考下
    2023-07-07
  • IntelliJ IDEA下自动生成Hibernate映射文件以及实体类

    IntelliJ IDEA下自动生成Hibernate映射文件以及实体类

    这篇文章主要介绍了IntelliJ IDEA下自动生成Hibernate映射文件以及实体类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 自定义BufferedReader的实例

    自定义BufferedReader的实例

    下面小编就为大家分享一篇自定义BufferedReader的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java16 JDK安装并设置环境变量的方法步骤

    Java16 JDK安装并设置环境变量的方法步骤

    突然想起自己大学刚接触java的时候,要下载JDK和配置环境变量,那时候我上网找了很多教学,本文就详细的介绍一下Java16 JDK安装并设置环境变量,感兴趣的可以了解一下
    2021-09-09
  • Java工具包之Lombok使用

    Java工具包之Lombok使用

    这篇文章主要介绍了Java工具包之Lombok使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • mybatis中注解与xml配置的对应关系和对比分析

    mybatis中注解与xml配置的对应关系和对比分析

    这篇文章主要介绍了mybatis中注解与xml配置的对应关系和对比分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • RestTemplate集成Ribbbon的示例代码

    RestTemplate集成Ribbbon的示例代码

    这篇文章主要介绍了RestTemplate集成Ribbbon的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 解析SpringBoot项目开发之Gzip压缩过程

    解析SpringBoot项目开发之Gzip压缩过程

    这篇文章主要介绍了SpringBoot项目开发之Gzip压缩过程,本文给大家分享几种Gzip压缩方式,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java编程实现帕斯卡三角形代码示例

    Java编程实现帕斯卡三角形代码示例

    这篇文章主要介绍了Java编程实现帕斯卡三角形代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java流程控制之循环结构while、do...while

    Java流程控制之循环结构while、do...while

    这篇文章主要介绍了Java流程控制之循环结构while及do...while,文章除了讲解循环结构while和do...while之外,还讲解了他们之间的区别,下面我们就一起进入文章讲解更多详细内容吧
    2021-12-12

最新评论