【Java】Record的使用 (简洁教程)

2024-08-28 01:12
文章标签 java 使用 教程 record 简洁

本文主要是介绍【Java】Record的使用 (简洁教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


文章目录

  • Java系列文章目录
  • 一、前言
  • 二、学习内容:
  • 三、问题描述
  • 四、解决方案:
    • 4.1 为什么引入Record
    • 4.2 Record与Class区别
    • 4.3 使用场景
  • 五、总结:
    • 5.1 场景使用
    • 5.2 字段的定义

一、前言

  • 学习Record有什么用

二、学习内容:

  • Record与Class的区别以及Record使用场景

三、问题描述

  • 为什么引入Record以及Record的作用

四、解决方案:

4.1 为什么引入Record

Java 引入 record 的主要原因是为了简化创建不可变数据类的过程,并提高代码的可读性和维护性。

以下是一些具体的原因:

减少样板代码:

  • 🌟 record 自动生成构造器、equals()、hashCode() 和 toString() 方法,以及每个字段的 getter方法,这样开发人员就可以专注于业务逻辑而不是样板代码。

不可变性:

  • 🌟 record 的所有字段默认是 final 的,这意味着它们是不可变的。这有助于创建线程安全和易于管理的数据模型。

简洁性:

  • record 允许你用更少的代码来定义数据类,使得类的定义更加清晰和简洁。

性能优化:

  • record 类型可能🌟 受到编译器的特定优化,例如更有效的内存布局,从而可能带来性能上的提升。

模式匹配的支持:

  • record 在模式匹配方面有更好的支持,这在 Java 14 及以后的版本中变得更加重要,尤其是在使用结构化绑定和改进的 switch
    表达式时。

易于调试:

  • 由于 record 自动提供了 toString() 方法,因此在调试时可以更容易地查看对象的状态。

明确的意图:

  • 使用 record 明确地表明了类的目的是作为一个简单的数据载体,这对于其他开发人员阅读代码时是有帮助的。

4.2 Record与Class区别

  • 观察下面Class代码与Record代码的区别
  • Class
package org.example.recodes;import java.util.Objects;public class Cat {String name;public String getName() {return name;}public Cat(String name) {this.name = name;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}Cat cat = (Cat) o;return Objects.equals(name, cat.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
}
  • Record
package org.example.recodes;public record RecordCat(String name) { }

🌟 上面两段代码是等效的

record 自动生成构造器、equals()、hashCode() 和 toString() 方法,以及每个字段的 getter方法

我们运行一下下面代码看看区别

package org.example.recodes;public class Main {public static void main(String[] args) {Cat cat = new Cat("mimi");System.out.println(cat.getName());System.out.println(cat);RecordCat recordCat = new RecordCat("momo");System.out.println(recordCat.name());System.out.println(recordCat);}
}

结果如下:
在这里插入图片描述

4.3 使用场景

它特别适用于那些仅用于存储数据而没有复杂业务逻辑的情况

Record所有字段默认是final
可扩展的部分包括:

非静态字段:

  • 虽然 record 默认所有的字段都是 final 的,但🌟你不能直接在 record 中添加非 final的字段。如果你需要这样的字段,应该使用 class。
public record Person(String name, int age) {  // 这是合法的,因为字段在声明中定义  // 不合法:不能再这里定义其他字段  // private final String address; // 这将导致编译错误  // 可以添加额外的方法  public String introduce() {  return String.format("My name is %s and I am %d years old.", name, age);  }  
}  

实例方法:

  • 除了 record 自动生成的方法外,你可以添加自己的实例方法来扩展 record 的功能。这些方法可以实现特定的业务逻辑或操作。

静态方法:

  • 你可以在 record 中添加静态方法,这些方法通常用于工厂模式,即创建 record 实例的替代构造方式。

私有方法:

  • 私有方法可以用来封装 record 内部的实现细节,例如辅助计算或验证逻辑。

嵌套类和内部类:

  • record 可以包含嵌套类和内部类,这些类可以用来定义相关的类型,比如枚举类型或其他辅助类。

接口实现:

  • record 可以实现一个或多个接口,这样就可以提供接口中定义的方法的实现。

注解:

  • record 可以使用注解来标记,这对于框架集成、元数据处理等非常有用。

泛型:

  • record 支持泛型,允许你定义泛型参数,从而创建通用的 record 类型。

覆盖默认方法:

  • 尽管 record 自动生成了一些方法,如 equals()、hashCode() 和toString(),你仍然可以覆盖这些方法以提供不同的实现。

五、总结:

5.1 场景使用

简单的数据使用

🌟 默认只有Getter方法

record Point(int x, int y) {// 无需显式定义构造器、equals()、hashCode() 或 toString()
}
public class Point {private final int x;private final int y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Point point = (Point) o;return x == point.x && y == point.y;}@Overridepublic int hashCode() {return Objects.hash(x, y);}@Overridepublic String toString() {return "Point{" +"x=" + x +", y=" + y +'}';}
}

5.2 字段的定义

🌟 在 Java 记录中,所有字段都必须在记录的参数列表中定义。
🌟 记录是不可变的:字段一旦赋值,不能被修改。
🌟 无法在记录内部定义额外的 private final 字段。

下面是相关解释

隐式 final:

  • 所有记录字段默认是 final,这意味着它们一旦被初始化,就不能再被修改

只能通过构造器定义:

  • 记录中的字段必须在记录声明的紧随其后的参数列表中定义,不能在记录的体内再次定义或声明。
  • 这意味着无法手动添加如 private final 字段,直接在类体内定义是非法的。

自动构造器和访问器:

  • Java 会为记录自动生成构造器,以及每个字段的访问器方法(getter)。因此,您不需要手动编写 getter 方法。
public record Person(String name, int age) {  // 这是合法的,因为字段在声明中定义  // 不合法:不能再这里定义其他字段  // private final String address; // 这将导致编译错误  // 可以添加额外的方法  public String introduce() {  return String.format("My name is %s and I am %d years old.", name, age);  }  
}  // 使用记录的主函数  
public class Main {  public static void main(String[] args) {  Person person = new Person("Alice", 30);  System.out.println(person.introduce()); // 输出:My name is Alice and I am 30 years old.  }  
}

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述

这篇关于【Java】Record的使用 (简洁教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113311

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数