首页 > 其他分享 >纪录类3-18

纪录类3-18

时间:2023-03-20 14:33:54浏览次数:22  
标签:return Point int 18 final record 纪录 public

使用​​String​​​、​​Integer​​等类型的时候,这些类型都是不变类,一个不变类具有以下特点:

  1. 定义class时使用​​final​​,无法派生子类;
  2. 每个字段使用​​final​​,保证创建实例后无法修改任何字段。

假设我们希望定义一个​​Point​​类,有​​x​​、​​y​​两个变量,同时它是一个不变类,可以这么写:

public final class Point {
private final int x;
private final int y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}

public int x() {
return this.x;
}

public int y() {
return this.y;
}
}

为了保证不变类的比较,还需要正确覆写​​equals()​​和​​hashCode()​​方法,这样才能在集合类中正常使用。后续我们会详细讲解正确覆写​​equals()​​和​​hashCode()​​,这里演示​​Point​​不变类的写法目的是,这些代码写起来都非常简单,但是很繁琐。

record

从Java 14开始,引入了新的​​Record​​类。我们定义​​Record​​类时,使用关键字​​record​​。把上述​​Point​​类改写为​​Record​​类,代码如下:

// Record

 Run

仔细观察​​Point​​的定义:

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

把上述定义改写为class,相当于以下代码:

public final class Point extends Record {
private final int x;
private final int y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}

public int x() {
return this.x;
}

public int y() {
return this.y;
}

public String toString() {
return String.format("Point[x=%s, y=%s]", x, y);
}

public boolean equals(Object o) {
...
}
public int hashCode() {
...
}
}

除了用​​final​​修饰class以及每个字段外,编译器还自动为我们创建了构造方法,和字段名同名的方法,以及覆写​​toString()​​、​​equals()​​和​​hashCode()​​方法。

换句话说,使用​​record​​关键字,可以一行写出一个不变类。

和​​enum​​类似,我们自己不能直接从​​Record​​派生,只能通过​​record​​关键字由编译器实现继承。

构造方法

编译器默认按照​​record​​声明的变量顺序自动创建一个构造方法,并在方法内给字段赋值。那么问题来了,如果我们要检查参数,应该怎么办?

假设​​Point​​类的​​x​​、​​y​​不允许负数,我们就得给​​Point​​的构造方法加上检查逻辑:

public record Point(int x, int y) {
public Point {
if (x < 0 || y < 0) {
throw new IllegalArgumentException();
}
}
}

注意到方法​​public Point {...}​​被称为Compact Constructor,它的目的是让我们编写检查逻辑,编译器最终生成的构造方法如下:

public final class Point extends Record {
public Point(int x, int y) {
// 这是我们编写的Compact Constructor:
if (x < 0 || y < 0) {
throw new IllegalArgumentException();
}
// 这是编译器继续生成的赋值代码:
this.x = x;
this.y = y;
}
...
}

作为​​record​​的​​Point​​仍然可以添加静态方法。一种常用的静态方法是​​of()​​方法,用来创建​​Point​​:

public record Point(int x, int y) {
public static Point of() {
return new Point(0, 0);
}
public static Point of(int x, int y) {
return new Point(x, y);
}
}

这样我们可以写出更简洁的代码:

var z = Point.of();
var p = Point.of(123, 456);

小结

从Java 14开始,提供新的​​record​​关键字,可以非常方便地定义Data Class:

  • 使用record定义的是不变类;
  • 可以编写Compact Constructor对参数进行验证;
  • 可以定义静态方法。

标签:return,Point,int,18,final,record,纪录,public
From: https://blog.51cto.com/wusen/6132755

相关文章

  • BigInteger和BigDecimal18
    BigInteger在Java中,由CPU原生提供的整型最大范围是64位​​long​​型整数。使用​​long​​型整数可以直接通过CPU指令进行计算,速度非常快。如果我们使用的整数范围超过了......
  • 18
    建立一套以数据采集为基础,数据分析、统计、管控为核心的综合性能源管理系统,详细需求描述如下:1、数据收集功能:生产区域以车间为主体,通过计量仪表远程收集蒸汽、冷凝水、电、......
  • ng-alain: i18n
    ​​ng-alain:i18n​​ ​​https://github.com/ng-alain/delon/blob/master/packages/theme/src/services/i18n/i18n.ts​​interfaceAlainI18NServiceabstract......
  • 18、Pod资源限制
    1、基础知识1.1、需求Kubernetes是分布式的容器管理平台,所有资源都有Node节点提供,而Node节点上运行着很多Pod业务有很多,在一个项目中,有的业务占用的资源比重大,有的小,想......
  • 【2023-03-18】同事聚会
    20:00会有新的花儿,新的绿叶会有其他温柔的日子。                                     ......
  • CF1804C 题解
    题目链接今天好不容易有空更那就再更一篇(一道很有意思的诈骗题,我会写出我的思考过程。题意:(我的翻译)一个转盘有$n$个格子分别为$0$$1$$2$$\cdots$$n-1$,初始时在......
  • CF1801G A task for substrings
    题面传送门卡常的出题人什么时候似啊?如果\(l=1,r=|t|\),那么就是蠢得不能再蠢的问题:直接扔到AC自动机上跑匹配就好了,可以做到\(O(\sum|s|+|t|)\)。现在询问的变成了......
  • # day18 打卡513.找树左下角的值 112. 路径总和 113.路径总和ii 106.从中序与后序遍
    day18打卡513.找树左下角的值112.路径总和113.路径总和ii106.从中序与后序遍历序列构造二叉树105.从前序与中序遍历序列构造二叉树513.找树左下角的值513题目链接......
  • DaVinci_Resolve_Studio_18.1.1达芬奇图文安装教程及下载
       ​ DaVinciResolve最大的特点是,将剪辑、调色、视觉特效、动态图形和音频后期制作融于一身,它采用美观新颖的界面设计,易学易用,能让新手用户快速上手操作,还能提供专......
  • SPSS 18 中文破解版安装包下载及图文安装教程​
    SPSS是一款由IBM公司精心打造的专业统计分析软件,它能提供统计分析、数据挖掘、预测建模产品及解决方案,并提供高级统计分析、丰富的机器学习算法、文本分析、开源扩展性、与......