🦔记录类
2021-3-6
| 2023-8-3
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
使用StringInteger等类型的时候,这些类型都是不变类,一个不变类具有以下特点:
  1. 定义class时使用final,无法派生子类
  1. 每个字段使用final,保证创建实例后无法修改任何字段
 
假设希望定义一个Point类,有xy两个变量,同时它是一个不变类,可以这么写:
为了保证不变类的比较,还需要正确覆写equals()hashCode()方法,这样才能在集合类中正常使用,代码写起来很繁琐。
 

record

从Java 14开始,引入了新的Record类。定义Record类时,使用关键字record。把上述Point类改写为Record类:
 
Point的定义:
改写为class,相当于:
除了用final修饰class以及每个字段外,编译器还自动创建了构造方法,和字段名同名的方法,以及覆写toString()equals()hashCode()方法。
换句话说,使用record关键字,可以一行写出一个不变类。
enum类似,不能直接从Record派生,只能通过record关键字由编译器实现继承。
 

构造方法

编译器默认按照record声明的变量顺序自动创建一个构造方法,并在方法内给字段赋值。那么问题来了,如果要检查参数,应该怎么办?
假设Point类的xy不允许负数,就得给Point的构造方法加上检查逻辑:
注意到方法public Point {...}被称为Compact Constructor,它的目的是编写检查逻辑,编译器最终生成的构造方法如下:
作为recordPoint仍然可以添加静态方法。一种常用的静态方法是of()方法,用来创建Point
这样可以写出更简洁的代码:
  • Java
  • 枚举类常用工具类
    目录