当前位置: 首页 > 科技观察

Java中您绝对不会使用的关键字?

时间:2023-03-11 22:35:56 科技观察

上一篇文章介绍了如何自定义不可变类。没看过的朋友,建议大家看看。本节课将向大家介绍Java中的一个关键字Record,Record的关键与不可变类有什么关系?看完今天的文章你就知道了。友情提示,Java14之后才支持Record关键字,是吗?如果你还在用Java8,那你肯定没用过!不可变类我们先看一下之前定义的不可变类,代码如下。packagecom.example.demo.immutable;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;publicfinalclassTeacher{privatefinalStringname;privatefinalList学生;私人最终地址地址;privatefinalMap元数据;publicTeacher(Stringname,Liststudents,Addressaddress,Mapmetadata){this.name=name;this.students=学生;this.address=地址;this.metadata=元数据;}publicStringgetName(){返回名称;}publicListgetStudents(){returnnewArrayList<>(students);//返回学生;}publicAddressgetAddress(){//返回地址;返回地址.clone();}publicMapgetMetadata(){returnnewHashMap<>(metadata);//返回元数据;}}如果将上面的代码复制到IDEA中,并且你的JDK版本是Java14之后的,那么你会看到如下提示,提示我们可以设置Teacher将可变类转换为Record是否令人困惑?没关系。让我们按照提示操作,看看会发生什么。点击后,我们的代码会变成如下。packagecom.example.demo.immutable;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;publicrecordTeacher(Stringname,Liststudents,地址address,Mapmetadata){@OverridepublicListstudents(){returnnewArrayList<>(students);//returnstudents;}@OverridepublicAddressaddress(){//返回地址;返回地址.clone();}@OverridepublicMapmetadata(){returnnewHashMap<>(metadata);//返回元数据;}}仔细看看你会发现这是怎么回事,什么是关键字记录,为什么类名后面有参数?乍一看,我以为它已经成为一种方法。另外,我们之前的测试代码在不修改任何逻辑的情况下,依然可以正常运行,是不是很神奇?这是Record关键字的性质。Record关键字看完了Record关键字的案例,我们就来说说Record关键字的使用方法以及它有什么特点。Record的key定义的类是不可变类;Record定义的类需要以参数的形式定义所有的成员变量;Record定义的类会默认生成所有参数的构造方法;Record定义的类可以定义静态方法;Record定义的类类可以提供一种紧凑的方式来执行参数验证;以上五点中的前三点在前面的例子中都可以看到,在定义和使用的时候可以很清楚的看到,如下图。publicrecordTeacher(Stringname,Liststudents,Addressaddress,Mapmetadata){}//1,2Teacherteacher=newTeacher("Java极客技术",students,address,metadata);//3接下来我们来看第四点和第五点。关于第四点,我们可以在Record类中定义一个静态方法来默认初始化对象,如下所示。这样,我们就可以写出更简洁的代码。publicstaticTeacherof(){returnnewTeacher("Java极客技术",newArrayList<>(),newAddress(),newHashMap<>());}publicstaticTeacherof(Stringname){returnnewTeacher(name,newArrayList<>(),newAddress(),newHashMap<>());在使用的时候,我们可以直接通过类名来引用静态方法,如下图Teacherteacher=Teacher.of();接下来我们看一下什么叫紧凑的参数校验方式。试想一下,如果我们在和Teacher对象通信的时候需要验证student成员变量不能为空,在我们之前的写法中,在构造方法中进行判断就可以了,但是对于Record这种形式,我们没有显式的creation构造方法,那么应该怎么判断呢?答案如下publicTeacher{if(null==students||students.size()==0){thrownewIllegalArgumentException();可以看到我们以简洁的构造方法的形式标定了参数Experience,这种写法和我们普通的构造方法不一样,没有方法参数,怎么这么神奇呢?综上所述,有人说Java的Record的新特性是为了防止大家使用Lombok,但是阿芬认为这不是真的。毕竟Lombok真的很好用,而Record只能定义不可变类。在一些情况下使用还是有局限性的,不可变类的使用场景并不多。