jdk17新特性—— record关键字(类似于Lombok功能)

目录

    • 一、record关键字的概述
      • 1.1、概述
      • 1.2、特性
    • 二、record关键字的代码示例
      • 2.1、record关键字代码示例
      • 2.2、record关键字代码.class文件示例
      • 2.3、record关键字代码示例 总结说明
    • 三、record关键字实现密封接口的代码示例
      • 3.1、record关键字实现密封接口的代码示例
    • 四、record关键字定义一个本地的record的代码示例
      • 4.1、record关键字定义一个本地的record的代码示例
    • 五、record关键字支持使用注解的代码示例
      • 5.1、record关键字支持使用注解的代码示例

一、record关键字的概述

1.1、概述

  • record为定义class提供了一种紧凑的语法,被record定义的类是浅不可变数据的透明持有者。
  • 浅不可变数据是指这样的一种类,它们用来描述一种简单的数据结构,这种数据结构的属性都是final不可变的(即状态不可变)。
  • 因为final字段只是不能对变量重复赋值,变量引用的对象本身是有可能可以被修改的,比如这个状态是一个集合的话,向集合中添加/删除元素等操作是可以的。

1.2、特性

  • JDK14的JEP 359: Records (Preview)引入;
  • JDK15的JEP 384: Records (Second Preview)进行了第二轮预览;
  • JDK16的JEP 395:Records转正。

二、record关键字的代码示例

2.1、record关键字代码示例

  • 创建Student的record代码示例

    package com.xz.jdk17.day4;public record Student(int id,String name, int sex) implements Comparable<Student>{/*** 构造函数可以声明为没有正式形参列表的形式,此时默认使用完整的状态参数列表* 允许构造函数只执行参数的验证和规范化,而省略显式的字段初始化。*/public Student {if(id< 0 ||sex >1){throw new RuntimeException("id或者性别不符合");}}@Overridepublic int compareTo(Student o) {return 0;}}
    
  • 创建StudentGroup的record代码示例

    package com.xz.jdk17.day4;import java.util.List;public record StudentGroup(List<Student> studentList,String groupName) {}
    
  • 测试类代码示例

    package com.xz.jdk17.day4;import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;/*** @Author: xz* @Date: 2024-02-02 19:31* @Description:*/
    public class Test {public static void main(String[] args) {Student student1 = new Student(1, "张三", 0);Student student2 = new Student(1, "张三", 0);System.out.println("id:"+student1.id()+",name:"+student1.name()+",sex:"+student1.sex());System.out.println(student1.hashCode());System.out.println(student1.equals(student2));System.out.println(student1.toString());List<Student> studentList = Arrays.stream(new Student[]{student1,student2}).collect(Collectors.toList());StudentGroup studenGroup = new StudentGroup(studentList, "group");System.out.println(studenGroup.toString());studenGroup.studentList().add(new Student(2, "李四", 1));System.out.println(studenGroup.toString());}
    }
    
  • 测试结果
    在这里插入图片描述

2.2、record关键字代码.class文件示例

  • 创建Student的record代码的.class文件示例

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by FernFlower decompiler)
    //package com.xz.jdk17.day4;public record Student(int id, String name, int sex) implements Comparable<Student> {public Student(int id, String name, int sex) {if (id >= 0 && sex <= 1) {this.id = id;this.name = name;this.sex = sex;} else {throw new RuntimeException("id或者性别不符合");}}public int compareTo(Student o) {return 0;}public int id() {return this.id;}public String name() {return this.name;}public int sex() {return this.sex;}
    }
  • 创建StudentGroup的record代码的.class文件示例

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by FernFlower decompiler)
    //package com.xz.jdk17.day4;import java.util.List;public record StudentGroup(List<Student> studentList, String groupName) {public StudentGroup(List<Student> studentList, String groupName) {this.studentList = studentList;this.groupName = groupName;}public List<Student> studentList() {return this.studentList;}public String groupName() {return this.groupName;}
    }
    

2.3、record关键字代码示例 总结说明

  • record关键字类似enum,也是一种特殊的class。
  • record会自动生成一个隐式的带参构造方法,默认没有无参构造方法,但record允许声明没有参数列表的构造方法,默认使用完整的状态参数列表,这允许构造函数只执行参数的验证和规范化,而省略显式的字段初始化。
  • record会自动为每个状态生成一个同名的get方法,注意方法名与变量名同名,不是getXxx。都是final字段自然没有set方法。
  • record会自动根据状态字段重写hashcode、equals以及toString方法。
  • record没有extend子句,所有record都直接继承java.lang.Record,但可以实现接口。
  • record是隐式final的,不能有抽象方法,不可再被继承,以防止被子类扩展方法改变状态。
  • record不能定义native方法,以防止record记录的状态被外部行为影响。

三、record关键字实现密封接口的代码示例

3.1、record关键字实现密封接口的代码示例

  • record关键字实现密封接口的代码示例

    public sealed interface Animal permits Cat, Dog{String eat();
    }public record Cat(String name) implements Animal {@Overridepublic String eat() {return name+"吃鱼";}
    }public record Dog(String name) implements Animal {@Overridepublic String eat() {return name+"吃骨头";}
    }
    

四、record关键字定义一个本地的record的代码示例

4.1、record关键字定义一个本地的record的代码示例

  • record关键字定义一个本地的record的代码示例

    public class Test1 {public static void main(String[] args) {List<String> list=new ArrayList<>();list.add("1");list.add("2");list.add("3");List<Integer> integers = get(list);System.out.println(integers);}public static List<Integer> get(List<String> list){//声明一个本地Recordrecord NumberRecord(String numberstr,int number){}return list.stream().map(num ->new NumberRecord(num, Integer.parseInt(num))).sorted((n1,n2)->Integer.compare(n2.number(),n1.number())).map(NumberRecord::number).collect(Collectors.toList());}
    }
    
  • 输出结果
    在这里插入图片描述

五、record关键字支持使用注解的代码示例

5.1、record关键字支持使用注解的代码示例

  • record关键字支持使用注解的代码示例

    public record Dept(@Deprecated int id,@Deprecated String deptName) {}
    
  • 对应的反编译代码如下,可以看到注解会被用于修饰构造方法的对应参数,以及字段的get方法

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/448284.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LSTM进行情感分析

LSTM进行情感分析的复现–pytorch的实现 关于TextCNN的复现参考本文章 TextCNN的复现–pytorch实现 - 知乎 (zhihu.com) 接下来主要是对代码内容的详解&#xff0c;完整代码将在文章末尾给出。 使用的数据集为电影评论数据集&#xff0c;其中正面数据集5000条左右&#xff…

2024美赛数学建模E题思路+代码

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

IP、端口、网络协议、TCP-IP五层模型

目录 IP地址 端口号 网络协议 协议分层&#xff08;TCP/IP五层模型&#xff09; 应用层 传输层&#xff08;也叫运输层&#xff09; 网络层 数据链路层 物理层 A用户通过qq给B发送一个字符串所经历的过程 IP地址 ip地址是一台主机的网络地址。 ip地址主要是用…

【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法

【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法 引言 在应用开发过程中&#xff0c;将应用程序上传到 App Store Connect 是一个关键的环节。本文将探讨几种常见的 IPA 文件上传方法&#xff0c;包括 Xcode、Application Loader、altool、Appuploader以及Transport…

【React】react组件传参

【React】react组件传参 一、props&#xff1a;父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递&#xff08;组件插槽&#xff09; 二、自定义事件&#xff1a;子父组件向父组件传参三、context进行多级组件传参四、redux全局状态管理 一、props&#xf…

Day06-Linux下目录命令讲解及重要文件讲解

Day06-Linux下目录命令讲解及重要文件讲解 1. Linux目录文件1.1 Linux系统目录结构介绍1.1.1 Linux与Windows目录结构对比 1.2 重要的Linux配置文件介绍1.2.1 /etc系统初始化及设置相关重要文件1.2.2 /usr目录的重要知识介绍------应用程序目录1.2.3 /var目录下的路径知识-----…

使用apifox创建一个Mock Server Api 接口

安装 下载 Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能&#xff0c;接口开发、测试、联调效率&#xff0c;提升 10 倍。最好用的接口文档管理工具&#xff0c;接口自动化测试工具。 创建mock api项目中使用 创建项…

【二进制漏洞】缓冲区溢出漏洞

天命&#xff1a;好像复现成功了&#xff0c;又好像没有完全成功 学习视频&#xff1a;抓住漏洞&#xff01;缓冲区溢出漏洞利用实例&#xff0c;如何利用溢出执行Shell Code_哔哩哔哩_bilibili 漏洞复现 实验环境&#xff1a;kali &#xff08;其实啥都试过&#xff0c;windo…

数据结构------算法时间复杂度

通俗的理解一下算法的时间复杂度 主要是看这个速发的时间性能&#xff0c;从这个算法规模入手&#xff0c;具体的看一下这个算法的所需时间与这个算法规模的关系 关系有 O(1) 常数次 1次 2次。。。。。。 O(n)一个for循环 O(n^2)两个for循环&#xff08;嵌套&#xff09; O(mn)…

EasyX图形库学习(一)

目录 一、easyX图形库基本介绍 1、easyX的原理 2、easyX的安装 3、easyX的颜色&#xff08;RGB颜色模型&#xff09; 颜色模型相关函数: 4、easyX的坐标 二、相关函数介绍: 绘图设备相关函数&#xff1a; 图形颜色及样式设置相关函数: 图形绘制相关函数: 文字输出相关…

real-time-emotion-detection 排坑记录

real-time-emotion-detection 排坑记录 任务踩坑回顾CV2包版本问题症状描述解决方法 模型文件路径问题症状描述解决办法 tensorflow版本问题症状描述解决办法 其他 任务 我之前跑了一个CNN情绪识别的开源代码&#xff0c;现在我想尝试把他用到我的另一个项目里。但当时那个项目…

BioTech - 小分子药物设计与优化 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135998902 小分子药物设计与优化&#xff0c;是利用计算机辅助技术&#xff0c;根据特定的生物学靶点&#xff0c;发现和改进具有治疗作用的小分子…