公司要新做一个医疗行业的业务,经过业务端和产品端的评估该业务与公司已有的产品线关联不大,用户后续也不想在老系统那台老爷车上继续使用,话说老系统到现在差不多10年了,中间经历过的前后端开发者形形色色,维护者换了一轮又一轮,系统已经日渐臃肿,页面UI也不大美观,作为技术研发人员也表示能够理解。而且从技术的角度考虑,新系统中除了要研发的新业务外,它所依赖的基础模块与传统的权限管理模式也大不相同,强行在原系统上研发的话,基础模块的重新搭建也是必不可少,到时候难免把原系统改的面目全非。经过综合考虑觉得重新搭建一套系统,前后端应用均从0开始研发。

新搭建的项目那java8肯定是不能再用了,技术人员也要跟上时代进步的步伐,果断安排上了springboot3和java17。说来也惭愧,我虽然是研发的老司机了,可新版本的jdk还没有在项目中实际使用过,这次研发新项目方才真正实践其中的一些新特性。

Records(数据类)

Records 是 Java 14 中作为预览功能引入,并在 Java 16 中正式成为永久特性的新功能。它的主要目的是简化不可变数据载体类(Data Carrier Class)的创建。这类类通常只包含数据字段,并提供访问这些字段的方法,而没有复杂的行为。

Records 出现之前,我们通常需要手动编写一个 POJO(Plain Old Java Object)类,包含私有字段、构造函数、getter 方法、equals()hashCode()toString() 方法。这不仅繁琐,而且容易出错。Records 正是为了解决这个问题而设计的。

1. 什么是 Record?

Record 是一种特殊的类,它代表其状态是其唯一有意义的特征的不可变数据。它自动为你生成:

  • 私有、final 的字段:对应于 record 头部中声明的组件。
  • 公共构造函数:参数与 record 组件的顺序和类型相同,用于初始化字段。
  • 公共的 accessor 方法(访问器):对于每个组件 x,会生成一个名为 x() 的方法(注意:不是 getX()),返回该字段的值。
  • equals(Object o) 方法:基于所有字段的值进行比较。
  • hashCode() 方法:基于所有字段的值生成哈希码。
  • toString() 方法:生成包含类名和所有字段名及其值的字符串表示。

2. 基本语法

public record Person(String name, int age) {// record body (可选)
}

这个简单的声明等价于以下传统类:

// 等价的传统写法
public final class Person {private final String name;private final int age;public Person(String name, int age) {this.name = name;this.age = age;}public String name() { // 注意:是 name() 而不是 getName()return name;}public int age() { // 注意:是 age() 而不是 getAge()return age;}// 自动生成的 equals, hashCode, toString...// ... (代码省略)
}

3. 使用 Record

public class RecordUseDemo {public static void main(String[] args) {// 创建 record 实例Person person = new Person("Alice", 30);// 访问字段 (使用 accessor 方法)System.out.println(person.name()); // 输出: AliceSystem.out.println(person.age());  // 输出: 30// toString()System.out.println(person); // 输出: Person[name=Alice, age=30]// equals() 和 hashCode()Person person2 = new Person("Alice", 30);System.out.println(person.equals(person2)); // 输出: trueSystem.out.println(person.hashCode() == person2.hashCode()); // 输出: true}
}

4. Record 的特性与限制

  • 隐式 finalRecord 类是隐式 final 的,不能被继承。
  • 隐式 publicRecord 类和其组件(字段)是隐式 public 的。
  • 不可变性:所有字段都是 private final 的,确保了 Record 实例的不可变性。
  • 无继承Record 不能 extends 其他类(因为它隐式继承了 java.lang.Record)。
  • 只能实现接口Record 可以 implements 接口。
  • 紧凑的构造函数:可以编写“紧凑构造函数”来对参数进行验证或预处理,但不能声明自己的字段。
public record Person(String name, int age) {// 紧凑构造函数 - 用于验证public Person {if (age < 0) {throw new IllegalArgumentException("Age cannot be negative");}// 注意:这里不能写 this.name = name; 或 this.age = age;// 字段的赋值由编译器自动完成// 你只能进行验证或修改组件值(通过 this(...) 调用其他构造函数,但 record 通常只有一个构造函数)// 或者调用 super(...),但 record 没有显式父类构造函数可调用。}// 你也可以添加静态方法或实例方法public boolean isAdult() {return age >= 18;}
}
  • 可以添加方法:可以在 Record 中添加静态方法、实例方法、甚至 getter/setter(尽管 setter 会破坏不可变性,不推荐)。
public record Point(int x, int y) {// 静态方法public static Point origin() {return new Point(0, 0);}// 实例方法public double distanceToOrigin() {return Math.sqrt(x * x + y * y);}// 可以重写自动生成的方法@Overridepublic String toString() {return "Point(" + x + ", " + y + ")";}
}

实践示例

在数据层的Maaper中定义数据类User, 用于查询接口的方法返回对象。

public interface MessageMapper {/*** 用户对象* @param id* @param name*/record User(String id, String name) {}/*** 获取发信人* @param messageId* @return*/User getSendUser(Long messageId);
}

Text Blocks(多行字符串)


使用三重引号(""")定义多行字符串,避免转义字符。简便了大段的文本处理效率,不用再检查字符串“+”拼接中的引号是否对称等特殊字符字符转义问题啦。
示例:

  // java8 之前的写法String s1 = "{\"name\":\"John\",\"age\":30}";// java 14 引入的写法String s2= """{"name": "John","age": 30}""";

应用场景:JSON/XML配置、SQL语句拼接,提升可读性。

Switch表达式


支持模式匹配和表达式返回值,替代传统switch语句。真是三目运算符的好帮手,写过三目运算符的都知道,有时候仅仅是多一个值选项就不得不转换为各种if else的嵌套写法,可以这样使用switch之后,写法真的简便很多。
示例

    int days=0;//java8 之前的写法switch (month) {case "JANUARY":case "MARCH":case "MAY":case "JULY":case "AUGUST":case "OCTOBER":case "DECEMBER":days = 31;break;case "APRIL":case "JUNE":case "SEPTEMBER":case "NOVEMBER":days = 30;break;case "FEBRUARY":days = 28;break;default:System.out.println("Invalid month.");break;}//java14之后的写法days = switch (month) {case "JANUARY", "MARCH", "MAY", "JULY", "AUGUST", "OCTOBER", "DECEMBER" -> 31;case "APRIL", "JUNE", "SEPTEMBER", "NOVEMBER" -> 30;case "FEBRUARY" -> 28;default -> throw new IllegalArgumentException("Invalid month: " + month);};

应用场景:状态机处理(如订单状态流转)。

以上就是我这边的使用过程和经历啦,后面项目中有其他特性应用再行补充和说明了。关于本文的内容和个人的使用经历,也欢迎大家在评论区留言和交流。

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

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

相关文章

Android中页面生命周期变化

一、Activity切换的生命周期变化&#xff08;A启动B&#xff09;1. 标准流程&#xff08;B完全覆盖A&#xff09;完整生命周期路径&#xff1a;Activity A&#xff1a;onPause()&#xff1a;失去焦点&#xff0c;仍部分可见onStop()&#xff1a;完全不可见&#xff08;当B完全覆…

自动驾驶控制算法——PID算法

自动驾驶控制算法——PID算法 文章目录自动驾驶控制算法——PID算法一、PID 是什么&#xff1f;二、PID 原理2.1 **比例环节&#xff08;P&#xff09;**2.2 **积分环节&#xff08;I&#xff09;**2.3 **微分环节&#xff08;D&#xff09;**2.4 特点总结2.5 案例分析 —— 小…

Spring Boot 异步执行方式全解析:@Async、CompletableFuture 与 TaskExecutor 对比

在 Spring Boot 开发中&#xff0c;异步执行是提升系统性能的重要手段&#xff0c;尤其适用于处理耗时操作&#xff08;如日志记录、邮件发送、数据同步等&#xff09;。本文将深入对比 Spring Boot 中三种主流的异步实现方式 ——Async注解、手动CompletableFuture和直接使用T…

高效微调2:Prompt-Tuning原理与实战

高效微调2:Prompt-Tuning原理与实战 Prompt-Tuning原理介绍 代码 Prompt-Tuning原理介绍 Prompt-Tuning Prompt-Tuning的思想:冻结主模型全部参数,在训练数据前加入一小段Prompt,只训练Prompt的表示层,即一个Embedding模块。其中,Prompt.又存在两种形式,一种是hard promp…

使用BART模型和T5模型实现文本改写

BART模型BART&#xff08;Bidirectional and Auto-Regressive Transformers&#xff09;是由 Facebook AI Research&#xff08;FAIR&#xff09;在 2019 年提出的序列到序列&#xff08;seq2seq&#xff09;预训练模型&#xff0c;论文发表于《BART: Denoising Sequence-to-Se…

电商前端Nginx访问日志收集分析实战

使用FileBeatLogstashES实现分布式日志收集 在大型项目中 &#xff0c;往往服务都是分布在非常多不同的机器上 &#xff0c;每个机器都会打印自己的log日志 但是 &#xff0c;这样分散的日志 &#xff0c;本来就无法进行整体分析。再加上微服务的负载均衡体系 &#xff0c;甚至…

TwinCAT3示例项目1

目录一、需求分析二、程序编写1.实现1盏灯的自控&#xff08;IF、TOF&#xff09;2. 添加模式控制&#xff08;Case、枚举&#xff09;3. 添加多盏灯&#xff08;FOR、数组&#xff09;4. 添加多组灯&#xff08;二维数组&#xff09;END项目结合了&#xff0c;FB&#xff0c;I…

如何在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能

这篇文章详细介绍了如何在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能&#xff0c;通过 PCI 设备直通&#xff08;Pass-Through&#xff09;技术将显卡分配给虚拟机使用&#xff1a; 在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能 1. 检查…

设计模式(二十二)行为型:策略模式详解

设计模式&#xff08;二十二&#xff09;行为型&#xff1a;策略模式详解策略模式&#xff08;Strategy Pattern&#xff09;是 GoF 23 种设计模式中最具实用性和广泛影响力的行为型模式之一&#xff0c;其核心价值在于定义一系列算法或行为&#xff0c;并将每个算法封装到独立…

AI+向量化

要理解 Java 如何结合 AI 与向量化&#xff0c;我们需要从向量化的核心概念、AI 中向量化的作用、Java 生态中的实现工具以及具体实践案例四个维度展开。以下是详细解析&#xff1a;一、核心概念&#xff1a;向量化与 AI 的关系向量化&#xff08;Vectorization&#xff09;是将…

Bootstap Vue 之b-form-radio-group 不显示选中状态问题

代码类似&#xff1a;<b-form-radio-groupclass"mt-2"required:disabled"dfrmDisabled"v-model"childDikeForm.SafetyAppraisalRank":options"[一, 二, 三, 四]"name"rankradioopt"></b-form-radio-group>经过测…

Shell 脚本实战:基于 for 循环的批量操作三例(账户创建、网络检测与密码管理)

一、编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如:test1、test2、test3、......、test10实现思路通过read命令获取用户输入的账户前缀和初始密码&#xff1b;加入非空校验&#xff1a;若前…

PBR技术

一 、PBR的概述1.定义策略路由&#xff1a; PBR 是一种覆盖路由器默认路由决策机制的技术。它允许管理员根据策略&#xff08;而不仅仅是目标地址&#xff09;来设置数据包的下一跳 IP 地址、出站接口、IP 优先级/DSCP 值等。路由策略&#xff1a;是指在路由器或三层设备上&…

STM32-ESP8266Wi-Fi模块使用USART实现通信/创建AP和STA模式配置教程(寄存器版)

本章思维导图&#xff1a;ESP8266WIFI模块简介ESP8266 是一款由乐鑫科技推出的低成本、高性能 Wi-Fi 模块&#xff0c;广泛应用于物联网和嵌入式开发领域。WIFI的频段5G和2.4G2.4G Wi-Fi与5G Wi-Fi最本质的区别即工作频段&#xff08;无线电波的频率&#xff09;不一样&#xf…

算法26. 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…

ROS2中传输样条曲线

在ROS2中传输样条曲线需要解决两个核心问题&#xff1a;**如何结构化表示曲线数据**和**如何高效传输**。以下是一套完整方案&#xff0c;结合自定义消息设计、序列化优化和QoS配置实现可靠传输&#xff1a;---### &#x1f4d0; 一、定义样条曲线的自定义消息 样条曲线通常由控…

Win11怎样安装DirectX 9

通过微软官方下载安装&#xff1a;确认系统兼容性并准备&#xff1a;确保显卡驱动为最新版本&#xff0c;因为 DirectX 与显卡驱动程序紧密相关。同时&#xff0c;可暂时关闭防病毒软件和防火墙&#xff0c;防止其干扰安装过程。下载安装程序&#xff1a;访问微软官方网站下载 …

RAGFLOW~Enable RAPTOR

Enable RAPTOR 一种递归抽象方法&#xff0c;用于长上下文知识检索和摘要&#xff0c;在广泛语义理解和细微细节之间取得平衡。 RAPTOR&#xff08;递归抽象处理用于树状组织检索&#xff09;是一种在2024年论文中引入的增强文档预处理技术。它旨在解决多跳问答问题&#xff0c…

【机器人+相机通讯】宇树科技相机通信

https://github.com/unitreerobotics/xr_teleoperate/blob/main/README_zh-CN.md 相机驱动与服务端 https://github.com/unitreerobotics/xr_teleoperate/blob/main/teleop/image_server/image_server.py 其中相机如果是realsense, 安装好驱动后&#xff0c;可以使用命令查看…

机械学习中的一些优化算法(以逻辑回归实现案例来讲解)

一、混淆矩阵混淆矩阵是机器学习中评估分类模型性能的重要工具&#xff0c;尤其适用于二分类或多分类任务。它通过展示模型预测结果与实际标签的匹配情况&#xff0c;帮助理解模型的错误类型&#xff08;如假阳性、假阴性等&#xff09;。以下通过二分类场景为例&#xff0c;结…