Java SE 16 record 类型说明与使用
Java SE 16 record 类型说明与使用
作者:Grey
原文地址:
CSDN:Java SE 16 record 类型说明与使用
说明
record 是 Java SE 16 的新特性
record 的使用场景
假设我们想创建一个不可变的类 Point,它有 x 和 y 的坐标。我们想实例化Point对象,读取它们的字段,并将它们存储在 List 中或在 Map 中作为键值使用。
我们可以这样实现 Point 类
public class Point {
private final int x;
private final int y;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
if (x != point.x) return false;
return y == point.y;
}
@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
return result;
}
@Override
public String toString() {
return "Point{" + "x=" + x + ", y=" + y + '}';
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
如上代码中重复写了很多模板代码,使用 Lombok,代码可以简化成如下方式
@AllArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
public class Point {
private final int x;
private final int y;
}
现在有了 record 上述所有代码可以简化为
public record Point(int x, int y) {}
使用javac Point.java && javap Point
,我们可以查看到 Point 反编译后的结果
public final class Point extends java.lang.Record {
public Point(int, int);
public final java.lang.String toString();
public final int hashCode();
public final boolean equals(java.lang.Object);
public int x();
public int y();
}
和我们最初始的 Point 类定义是一样的,所以 record 可以大量简化代码的编写。
我们可以像正常使用类一样使用 record
示例代码
public class App {
public static void main(String[] args) {
Point p = new Point(3, 4);
int x = p.x();
int y = p.y();
System.out.println(x + " " + y);
Point p2 = new Point(3, 4);
Point p3 = new Point(7, 5);
System.out.println(p2.equals(p)); // 输出 true
System.out.println(p2.equals(p3)); // 输出 false
}
}
record 可以通过如下方式来实现多构造函数
public record Point(int x, int y) {
public Point() {
this(3, 3);
}
public Point(int v) {
this(v, v + 3);
}
}
record 中可以包括 static 类型变量,示例如下
public record Point(int x, int y) {
private static final int ZERO = 0;
private static long count = 0;
public Point() {
this(ZERO, ZERO);
synchronized (Point.class) {
count++;
}
}
public static synchronized long getCount() {
return count;
}
public Point(int v) {
this(v, v + 3);
}
}
如果要覆盖 record 的默认构造函数,则函数入参一定要和 record 的入参保持一致,否则会报错
正确
public record Point(int x, int y) {
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
错误
public record Point(int x, int y) {
public Point(int m, int n) {
this.x = m;
this.y = n;
}
}
record 中可以自定义非 static 方法,例如
public record Point(int x, int y) {
public double distanceTo(Point target) {
int dx = target.x() - this.x();
int dy = target.y() - this.y();
return Math.sqrt(dx *dx + dy* dy);
}
}
调用方法
public class App {
public static void main(String[] args) {
Point from = new Point(17, 3);
Point to = new Point(18, 12);
double distance = from.distanceTo(to);
System.out.println(distance);
}
}
record 也可以实现接口,但是无法继承类
正确
public record Point(int x, int y) implements WithXCoordinate {}
public interface WithXCoordinate {
int x();
}
错误
public record Point(int x, int y) extends WithXCoordinate {}
public class WithXCoordinate {
int x(){}
}
record 也无法被其他类继承,例如
错误
public record Point(int x, int y) {}
public class WithXCoordinate extends Point{
int x(){}
}
源码
参考文档
Java SE 16 record 类型说明与使用的更多相关文章
- Java SE 16 新增特性
Java SE 16 新增特性 作者:Grey 原文地址:Java SE 16 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 14 新增特性
Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 17 新增特性
Java SE 17 新增特性 作者:Grey 原文地址:Java SE 17 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 19 新增特性
Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...
- Java SE 15 新增特性
Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- 实战 Java 16 值类型 Record - 2. Record 的基本用法
在上一篇文章实战 Java 16 值类型 Record - 1. Record 的默认方法使用以及基于预编译生成相关字节码的底层实现中,我们详细分析了 Record 自带的属性以及方法和底层字节码与实 ...
- Java SE 6 新特性: HTTP 增强--转
概述 Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HT ...
- Java Se 基础系列(笔记) -- OO
记录所学到的关于Java Se的一些基础知识 1.对象是通过“属性(成员变量)”和“方法”来分别对应事物所具有的静态属性和动态属性 2.类(Class)是对某一类事物的抽象,对象(Object)为某个 ...
- 黑马程序员 ——Java SE(1)
----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训 ...
随机推荐
- 零基础学Java(1)初识Java程序
前言 就国内来说,Java毫无疑问是后端语言中的No.1没有之一,所以今天我们也来0基础学习Java!!! Java的好处(针对测试工程师) 面试加分->涨薪 大多数公司服务端用的都是Java, ...
- 腾讯云数据库公有云市场稳居TOP 2!
7月4日,国际权威机构IDC发布的<2021年下半年中国关系型数据库软件市场跟踪报告>显示,腾讯云数据库在关系型数据库软件市场(公有云模式)中,位列第二. IDC报告显示,2021下半年中 ...
- Python语法糖,提升编程幸福感!!!
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/a52bc938.html 大家好,我是测试蔡坨坨. 今天,我们来盘点一下Python中的那些语法糖. 什么是语法糖?语法糖不 ...
- Windows安装face_recognition
安装提供的python和cmake,最好都添加一下环境变量 安装dlib,pip install dlib-19.7.0-cp36-cp36m-win_amd64.whl 安装face_recogni ...
- Eolink 全局搜索介绍【翻译】
随着前后端分离成为互联网项目开发的标准模式, API 成为了前后端联通的桥梁.而面对越来越频繁和复杂的调用需求,项目里的 API 数量也越来越多,我们需要通过搜索功能来快速定位到对应的 API来进行使 ...
- 【前端面试】Vue面试题总结(持续更新中)
Vue面试题总结(持续更新中) 题目参考链接 https://blog.csdn.net/weixin_45257157/article/details/106215158 由于已经有很多前辈深造VU ...
- Note -「模拟退火」
随机化算法属于省选芝士体系 0x01 前置芝士 你只需要会 rand 就可以啦! 当然如果你想理解的更透彻也可以先看看 爬山算法 0x02 关于退火 退火是一种金属热处理工艺,指的是将金属缓慢加热到一 ...
- SpringWeb 拦截器
前言 spring拦截器能帮我们实现验证是否登陆.验签校验请求是否合法.预先设置数据等功能,那么该如何设置拦截器以及它的原理如何呢,下面将进行简单的介绍 1.设置 HandlerInterceptor ...
- SSH远程登录:两台或多台服务器之间免密登录设置
有两台(或多台)同局域网的服务器A:192.168.2.21,B:192.168.2.25.让A,B这两台服务器之间能两两互相免密登录,并且每台服务器都可以自我免密登录(自我免密登录即:ssh loc ...
- 从零开始Blazor Server(1)--项目搭建
项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...