type
status
date
slug
summary
tags
category
icon
password
Property
使用
String
、Integer
等类型的时候,这些类型都是不变类,一个不变类具有以下特点:- 定义class时使用
final
,无法派生子类
- 每个字段使用
final
,保证创建实例后无法修改任何字段
假设希望定义一个
Point
类,有x
、y
两个变量,同时它是一个不变类,可以这么写:为了保证不变类的比较,还需要正确覆写
equals()
和hashCode()
方法,这样才能在集合类中正常使用,代码写起来很繁琐。record
从Java 14开始,引入了新的
Record
类。定义Record
类时,使用关键字record
。把上述Point
类改写为Record
类:Point
的定义:改写为class,相当于:
除了用
final
修饰class以及每个字段外,编译器还自动创建了构造方法,和字段名同名的方法,以及覆写toString()
、equals()
和hashCode()
方法。换句话说,使用
record
关键字,可以一行写出一个不变类。和
enum
类似,不能直接从Record
派生,只能通过record
关键字由编译器实现继承。构造方法
编译器默认按照
record
声明的变量顺序自动创建一个构造方法,并在方法内给字段赋值。那么问题来了,如果要检查参数,应该怎么办?假设
Point
类的x
、y
不允许负数,就得给Point
的构造方法加上检查逻辑:注意到方法
public Point {...}
被称为Compact Constructor,它的目的是编写检查逻辑,编译器最终生成的构造方法如下:作为
record
的Point
仍然可以添加静态方法。一种常用的静态方法是of()
方法,用来创建Point
:这样可以写出更简洁的代码: