package com.example.demo.immutable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public record Teacher(String name, List<String> students, Address address, Map<String, String> metadata){
@Override
public List<String> students(){
return new ArrayList<>(students);// return students;}
@Override
public Address address(){// return address;
return address.clone();}
@Override
public Map<String, String> metadata(){
return new HashMap<>(metadata);// return metadata;}}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
仔细一看你会发现,这是什么情况,record 是什么关键字,然后类名后面怎么还有参数?乍一看还以为变成一个方法了。此外我们之前的测试代码不用修改任何逻辑,照样可以正常运行,是不是很神奇?这就是 Record 关键字的特性。
Record 关键字
看完了 Record 关键字的 case ,我们来聊一下 Record 关键字是怎么用的,以及它有什么特性。
Record 关键定义的类是不可变类;
Record 定义的类需要将所有成员变量通过参数的形式定义;
Record 定义的类默认会生成全部参数的构造方法;
Record 定义的类中可以定义静态方法;
Record 定义的类可以提供紧凑的方式进行参数校验;
上面的五点里面前三点我们在之前的例子中都可以看出来,在定义和使用的时候可以明显的看到,如下所示。
public record Teacher(String name, List<String> students, Address address, Map<String, String> metadata){}//1,2
Teacher teacher = new Teacher("Java极客技术", students, address, metadata);//3
1.
2.
3.
下面我们看下第四点和第五点,关于第四点我们可以在 Record 类中定义静态方法用来默认初始化对象,如下所示,通过这种方式我们可以写出更简洁的代码。
public static Teacher of(){
return new Teacher("Java极客技术", new ArrayList<>(), new Address(), new HashMap<>());}
public static Teacher of(String name){
return new Teacher(name, new ArrayList<>(), new Address(), new HashMap<>());}
1.
2.
3.
4.
5.
6.
7.
在使用的时候,我们就可以直接通过类名引用静态方法就可以了,如下所示
Teacher teacher = Teacher.of();
1.
接下来我们看看什么叫紧凑的方式进行参数校验,试想一下,如果我们需要校验在沟通 Teacher 对象的时候,student 成员变量不能为空,在我们以前的写法里面只要在构造方法里面进行一下判空就可以了,但是对于 Record 的形式,我们没有显示的创建构造方法,那我们应该如何进行判断呢?答案如下
public Teacher {
if (null== students || students.size()==0){
throw new IllegalArgumentException();}}