jdk14至16——record关键字

news2024/12/29 7:42:50

record类型是从14开始预览到16成为正式版的,record类型是一种受限制的类,一般用来封装不可变对象,record类型会自动生成一个全部属性的构造方法,以及属性的get方法,但没有set方法,会自动生成hashCode()、equals()、toString()方法;(有点像Lombok的@Data功能)

另外自动生成的get方法不会使用getXxxx()的名字,而是直接用xxxx(),没有get这个单词前缀;

record生成的类是final修饰的,并且只有一个java.lang.Record父类,不能继承也不能被继承,但是可以实现接口,record类里也可以有实例方法、静态属性和静态方法,但是不能有实例属性,也可以有自定义的构造方法,构造方法里再用this(xxxx)调用自动生成的构造方法,也可以使用不带括号和参数的构造方法对自动生成的构造方法进行调整;

定义一个record类型很简单,可以在独立文件里定义:

package test;

public record MyRecord(String name, int age) {
	
}

也可以定义成类属性:

public record MyRecord2(int x, int y) {}

也能定义在方法内部:

	public void test() {
		record MyRecord3(String s) {}
	}

用来临时做一些记录很方便;

可以用javap看一下record类型自动生成的类的样子:

先定义一个名叫A.java的record类型:

然后javac A.java编译下,再用javap -p A.class查看属性和方法:

可以看到是一个final类并且继承java.lang.Record类,所有自动生成的方法都是public的,属性是private final的;

另外Class类还新增了用来处理Record类型的方法:

public boolean isRecord():判断class是不是record类型;

public RecordComponent[] getRecordComponents():返回记录组件,可用来反射动态调用;

测试demo:

MyRecord类:

package test;

public record MyRecord(String name, int age) {
	
	private static String info = "这是一个用于记录name和age的record";
	
	public MyRecord {
		name = name.toUpperCase();	//生成的构造方法里将名字变大写
		age = age + 1;	//生成的构造方法里将age都加1
	}
	
	public MyRecord(String firstName, String lastName, int age) {
		this("%s %s".formatted(firstName, lastName), age);
	}
	
	public void say() {
		System.out.println("你好,我是" + name);
	}
	
	public static String getRecrodInfo() {
		return info;
	}
	
}

main测试类:

package test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.RecordComponent;

public class MainTest {
	
	public record MyRecord2(int x, int y) {}

	public static void main(String[] args) {
		MyRecord x = new MyRecord("Tom", 12);
		System.out.println(x.name());
		System.out.println(x.age());
		System.out.println(x);
		
		System.out.println("IsRecord=" + MyRecord.class.isRecord());
		
		System.out.println("=".repeat(40));
		RecordComponent[] comp = MyRecord.class.getRecordComponents();
		for (RecordComponent c : comp) {
			System.out.println("RecordComponent:" + c);
			Method method = c.getAccessor();
			try {
				System.out.println("_method:" + method);
				System.out.println("_method result:" + method.invoke(x, null));
			} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println("=".repeat(40));
		MyRecord x2 = new MyRecord("John", "Smith", 23);	
		System.out.println(x2);
		x2.say();
		System.out.println(MyRecord.getRecrodInfo());
	}
	
	public void test() {
		record MyRecord3(String s) {}
	}

}

运行结果:

实现接口的小例子:

package test;

public class MainTest {
	
	interface MyInterface {
		void fun();
	}
	
	record MyRecord(String s) implements MyInterface {
		@Override
		public void fun() {
			System.out.println("s=" + s);
		}
	}
	
	public static void main(String[] args) {
		MyRecord r = new MyRecord("HELLO WORLD");
		System.out.println(r);
		r.fun();
	}
	
}

结果:

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

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

相关文章

JS中深拷贝浅拷贝的区别

深浅拷贝在MDN官方中的表述是这样的: 对象的深拷贝是指其属性与其拷贝的源对象的属性不共享相同的引用(指向相同的底层值)的副本。因此,当你更改源或副本时,可以确保不会导致其他对象也发生更改;也就是说&a…

vue下拉框vue字典映射转换失败 字符转数字parseInt :value vue下拉框无法选择 选什么都是最后一个 el-select默认选中 el-select设为只读 input输入框设为只读

现象&#xff1a; 解决后&#xff1a; 关键点&#xff1a; 1、value"0" 与 :value"0" 不同&#xff0c;加冒号:试试 2、:value"parseInt(dict.dictValue)" 字符串转int试试 parseInt() 写死下拉框 <el-form-item label"类型" pro…

COBOL 程序结构

COBOL 程序结构 COBOL程序结构由部&#xff08;division&#xff09;组成&#xff0c;如下图所示&#xff1a; 这些部简介如下&#xff1a; **Sections&#xff08;节&#xff09;**是程序逻辑的逻辑细分。节是段落的集合。**Paragraphs&#xff08;段&#xff09;**是一个节…

路面积水监测-路面积水监测系统

在城市化进程不断加快的背景下&#xff0c;城市道路面临着日益严重的积水问题。持续的降雨和不良的排水系统导致路面积水&#xff0c;给交通运输和城市生活带来了诸多不便和安全隐患。路面积水监测系统旨在易涝点布设内涝积水监测仪&#xff0c;实时了解路面积水情况&#xff0…

矿井水除氟,污水除氟的工艺分析

高矿化度的废水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

【Nginx】缓存集成

文章目录 缓存的概念Nginx的web缓存服务Nginx缓存设置的相关指令Nginx缓存设置案例Nginx缓存的清除方式一:删除对应的缓存目录方式二:使用第三方扩展模块 Nginx设置资源不缓存 缓存的概念 缓存就是数据交换的缓冲区(称作:Cache),当用户要获取数据的时候&#xff0c;会先从缓存…

DOUBLETROUBLE 1

文章目录 DOUBLETROUBLE: 1实战演练一、前期准备1、相关信息 二、信息收集1、nmap探测目标靶机端口2、扫描目标网址目录3、访问网站&#xff0c;发现secret下有个图片4、将图片下载5、查看图片所含内容6、破解密码并查看7、登陆邮箱8、创建反弹shell9、上传反弹shell10、监听11…

【云计算架构】通过新的优化视角查看云架构

仅仅让云部署工作不再是目标。关注构建和部署最佳解决方案的新指标和方法。 随着云计算架构的成熟&#xff0c;我们定义成功的方式也应该成熟。在2021&#xff0c;我指出&#xff0c;优化云计算更多的是二进制过程&#xff0c;而不是模拟过程。 我当时所说的仍然是正确的&#…

【医学图像】图像分割系列.1

医学图像分割是一个比较有应用意义的方向&#xff0c;本文简单介绍三篇关于医学图像分割的论文&#xff1a; UNeXt&#xff08;MICCAI2022&#xff09;&#xff0c;PHTrans&#xff08;MICCAI2022&#xff09;&#xff0c;DA-Net&#xff08;MICCAI2022&#xff09;。 目录 …

目标追踪---deepsort原理讲解

目录 一、多目标追踪的主要步骤 二、sort流程 三、Deepsort算法流程 一、多目标追踪的主要步骤 获取原始视频帧利用目标检测器对视频帧中的目标进行检测将检测到的目标的框中的特征提取出来&#xff0c;该特征包括表观特征&#xff08;方便特征对比避免ID switch&#xff0…

SQL语句练习附带答案

首先创建数据库filmclub DROP DATABASE IF EXISTS filmclub;CREATE DATABASE filmclub;USE filmclub;CREATE TABLE category (cid INT PRIMARY KEY AUTO_INCREMENT,cname VARCHAR(20) )CHARSETutf8; CREATE TABLE film (fid INT PRIMARY KEY AUTO_INCREMENT,fname VARCHAR(20)…

ChatGPT和 dalle2 配合生成故事绘本

和 dalle2 配合生成故事绘本 在之前章节中&#xff0c;我们已经尝试过让 ChatGPT 来生成一些故事情节&#xff0c;不管是影视剧还是小说还是游戏都可以。这时候&#xff0c;自然而然的可以联想到&#xff1a;那我们可不可以一步到位&#xff0c;把 ChatGPT 编出来的故事情节&a…

为什么MySQL数据库单表建议最大2KW数据?

文章目录 为什么MySQL数据库单表建议最大2KW数据&#xff1f;一、 Innodb 存储引擎1、数据存储2、数据页的结构 二、 B tree 结构三、 B 树存放数据的行数 为什么MySQL数据库单表建议最大2KW数据&#xff1f; 我们经常会听到一种说法&#xff0c;在MySQL中&#xff0c;数据库单…

Spring Security 中的 CSRF 攻击是什么?如何防止它?

Spring Security 中的 CSRF 攻击是什么&#xff1f;如何防止它&#xff1f; 什么是 CSRF 攻击&#xff1f; CSRF&#xff08;Cross-Site Request Forgery&#xff09;攻击是一种常见的网络安全威胁&#xff0c;也称为“跨站请求伪造”攻击。攻击者可以通过某些手段&#xff0…

SpringBoot整合RabbitMQ及其原理分析

上一篇&#xff1a;RabbitMQ基础知识 1、相关依赖 这里无需指定版本号&#xff0c;让其跟着SpringBoot版本走。本示例使用SpringBoot版本号为2.7.10。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-…

SaaS系统平台,如何兼顾客户的个性化需求?

在当今数字化的商业环境中&#xff0c;SaaS系统已经成为企业运营的重要组成部分之一。 SaaS系统平台的好处是显而易见的&#xff0c;可以将业务流程数字化&#xff0c;从而帮助企业提高效率并节省成本。 但是&#xff0c;由于每个企业的业务都不尽相同&#xff0c;所以在选择Sa…

GuLi商城-前端基础ES6

ES6 ES6全称ECMAScript6.0是JavaScript语言的下一代标准。 ECMAScript是浏览器脚本语言的规范&#xff0c;而我们熟悉的各种js语言&#xff0c;如JavaScript则是规范的具体实 现。 新建一个ES6文件夹&#xff0c;shift!按着不动&#xff0c;回车&#xff0c;可以快速生成模…

图神经网络:(处理点云)PPFNet的实现

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 前言文献阅读代码实操历史遗留问题 前言 本篇文章接上一篇文章…

【LeetCode: 410. 分割数组的最大值 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

这七种常见的路由协议,每一个网络工程师都应该知道!

你好&#xff0c;这里是网络技术联盟站。 路由协议是网络中非常重要的一个概念&#xff0c;它负责将数据包从源节点传递到目的节点。路由协议定义了网络中不同路由器之间的通信规则和数据传输方式&#xff0c;以便有效地将数据包从源地址传输到目标地址。在网络领域中&#xf…