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

news2024/11/18 21:50:58

目录

    • 一、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或者性别不符合");
            }
        }
    
        @Override
        public 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 {
        @Override
        public String eat() {
            return name+"吃鱼";
        }
    }
    
    public record Dog(String name) implements Animal {
        @Override
        public 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){
            //声明一个本地Record
            record 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.coloradmin.cn/o/1428489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 常用命令行

Linux (Ubuntu) 常用操作命令行 1. 打开终端&#xff1a;ctrl alt t; 2. 清屏&#xff1a;clear; 3. 进入目录&#xff1a;cd path;[/ 根目录&#xff1b;./ 当前目录&#xff1b;../ 上一级] 4. 返回上一级目录: cd ..; 5. 显示工作路径: pwd; 6. 列表显示文件、文件夹&…

PAT-Apat甲级题1004(python和c++实现)

PTA | 1004 Counting Leaves 1004 Counting Leaves 作者 CHEN, Yue 单位 浙江大学 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child. Input Specification: Each input file contains one te…

【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本)

目录 一、前言 二、pytorch简介 三、安装准备工作 3.1、下载Anaconda 四、判断是否有NVIDIA显卡 五、安装pytorch-CPU版本 六、安装pytorch-GPU版本 6.1、查看CUDA显卡驱动版本 6.2、安装CUDA 6.3、安装CuDNN&#xff08;加速器&#xff09; 6.4、安装pytorch-GPU 七…

瑞_23种设计模式_原型模式

文章目录 1 原型模式&#xff08;Prototype Pattern&#xff09;原型模式的结构 2 实现3 案例3.1 需求3.2 设计3.3 代码实现3.3.1 浅克隆代码实现3.3.2 深克隆代码实现 3.4 总结 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《23种设计模式》的原型模式篇。本文中的部…

通用缓存SpringCache

概述 在项目中&#xff0c;我们通常会把高频的查询进行缓存。如资讯网站首页的文章列表、电商网站首页的商品列表、微博等社交媒体热搜的文章等等&#xff0c;当大量的用户发起查询时&#xff0c;借助缓存提高查询效率&#xff0c;同时减轻数据库压力。 目前的缓存框架有很多:…

【Linux C | 网络编程】netstat 命令图文详解 | 查看网络连接、查看路由表、查看统计数据

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

深度学习快速入门--7天做项目

深度学习快速入门--7天做项目 0. 引言1. 本文内容2. 深度学习是什么3. 项目是一个很好的切入点4. 7天做项目4.1 第一天&#xff1a;数据整理4.2 第二天&#xff1a;数据处理4.3 第三天&#xff1a;简单神经网络设计4.4 第四天&#xff1a;分析效果与原因4.5 第五天&#xff1a;…

day02.C++命名空间

目录 一、命名空间的作用 二、命名空间的定义 三、命名空间的镶嵌定义 四、命名空间的使用方法 一、命名空间的作用 一个中大型软件往往由多名程序员共同开发&#xff0c;会使用大量的变量和函数&#xff0c;不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过…

iOS应用崩溃了,如何通过崩溃手机连接电脑查找日志方法

在iOS应用开发过程中&#xff0c;调试日志和奔溃日志是开发者必不可少的工具。当iOS手机崩溃时&#xff0c;我们可以连接电脑并使用Xcode Console等工具来查看日志。然而&#xff0c;这种方式可能不够方便&#xff0c;并且处理奔溃日志也相当繁琐。克魔助手的出现为开发者带来了…

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表 空链表&#xff1a; 注意&#xff1a;函数不能返回局部变量的地址 操作&#xff1a; 1.创建空链表 2.头插 3.尾插 4.链表遍历 5.链表的长度 free&#xff1a;释放 删除&#xff1a; 头删 void popFront(struct Node *head) { //1.p指针变量指向首节点 //2.断…

康姿百德床垫价格合理功效好,用科技力量守护您的睡眠健康

现代生活中&#xff0c;优质睡眠的观念已深入人心。人们渐渐认识到&#xff0c;一个舒适的床垫不仅仅是睡眠的工具&#xff0c;更是健康的守护者。很多朋友在选购床垫一掷千金&#xff0c;却找不到一款合适的床垫。康姿百德床垫是专为提升睡眠质量研发的床垫&#xff0c;成为了…

网络安全全栈培训笔记(60-服务攻防-中间件安全CVE复现WeblogicJenkinsGlassFish)

第60天 服务攻防-中间件安全&CVE复现&Weblogic&Jenkins&GlassFish 知识点: 中间件及框架列表: lIS,Apache,Nginx,Tomcat,Docker,Weblogic,JBoos,WebSphere,Jenkins, GlassFish,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Sprng,Flask,jQuery 1、中间件-Web…

Portainer访问远程Docker (TLS加密)

前言&#xff1a; docker的2375端口&#xff0c;出于安全性考虑即(Docker Remote API未授权访问漏洞)&#xff0c;是不开放的&#xff0c;如果想要管理远程docker&#xff0c;可以使用TLS机制来进行访问&#xff0c;这里以Portainer访问连接为例 文章参考&#xff1a;https://b…

外卖,也可以“聚合”

文章首发于微信公众号:PenguinPay &#xff0c;欢迎关注。 一、背景 1.1 订单来源 在过去&#xff0c;商家普遍使用传统POS收银软件进行线下店面收银&#xff0c;可以在一定程度上提升收银效率。 之后随着O2O外卖渠道的发展&#xff0c;越来越多的商家选择在线上平台运营门店…

吸猫毛空气净化器哪个好?推荐除猫毛效果好的宠物空气净化器品牌

如今&#xff0c;越来越多的家庭选择养宠物&#xff0c;使家庭变得更加温馨。然而&#xff0c;养宠物可能会带来异味和空气中的毛发增多&#xff0c;这可能会成为一大困扰&#xff0c;并对健康造成问题。 为了不让家里充斥着异味&#xff0c;特别是来自宠物便便的味道&#xf…

DATAX改造支持geometry类型数据同步

数据库使用postgresql安装了postgis插件存储了geometry空间数据&#xff0c;想使用datax做数据同步&#xff0c;但datax本身不支持geometry类型数据&#xff0c;如何改造呢&#xff1f; 1.首先下载已改造支持geometry类型的datax引擎&#xff0c;下载地址 https://download.c…

《区块链简易速速上手小册》第5章:智能合约(2024 最新版)

文章目录 5.1 智能合约的概念5.1.1 智能合约的基础知识5.1.2 主要案例&#xff1a;去中心化金融&#xff08;DeFi&#xff09;平台5.1.3 拓展案例 1&#xff1a;智能合约在供应链管理中的应用5.1.4 拓展案例 2&#xff1a;智能合约在房地产交易中的应用 5.2 智能合约的应用案例…

函数重载你真的了解吗?

1.什么叫函数重载&#xff1f; 函数重载&#xff08;Function Overloading&#xff09;是指在同一个作用域内&#xff0c;允许定义多个具有相同名称但参数列表不同的函数。具体而言&#xff0c;函数重载允许你定义同名的函数&#xff0c;但这些函数应该有不同的参数类型、参数个…

代码随想录算法训练营Day44|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ

目录 完全背包理论基础 完全背包问题 算法实现 518.零钱兑换II 前言 思路 377. 组合总和 Ⅳ 前言 思路 算法实现 总结 完全背包理论基础 题目链接 文章链接 完全背包问题 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是…

计网——应用层

应用层 应用层协议原理 网络应用的体系结构 客户-服务器&#xff08;C/S&#xff09;体系结构 对等体&#xff08;P2P&#xff09;体系结构 C/S和P2P体系结构的混合体 客户-服务器&#xff08;C/S&#xff09;体系结构 服务器 服务器是一台一直运行的主机&#xff0c;需…