this.address = address;
}
@Override
public int hashCode() {
return Objects.hash(name, address);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else if (!(obj instanceof Person)) {
return false;
} else {
Person other = (Person) obj;
return Objects.equals(name, other.name)
&& Objects.equals(address, other.address);
}
}
@Override
public String toString() {
return “Person [name=” + name + “, address=” + address + “]”;
}
// standard getters
}
为了达到我们的需求,我们这里有两个小问题:
1. 这个类里包含太多样板化的代码了
2. 我们为了写一个Person类包含name和address两个字段,写了太多别的东西从而让这个类太复杂了
第一种情况,我们必须对每个这种class重复相同的繁琐过程,为每个数据段单调地创建一个新字段,创建equals、hashCode和toString方法,并创建一个接受每个字段的构造函数。
虽然现在很多IDE可以自动生成这些代码,但是有个问题是它们没办法去在我们修改字段后主动的更新对应生成的代码。比如我新增一个age字段,构造方法、equals方法之类的我都要删了重写,IDE没法自动更新,而且还很容易遗漏或是忘记更新这些方法。
第二种情况,额外的代码掩盖了我们的类只是一个数据类,它有两个字符串字段:name和address。
更好的方法是显式声明我们的类是一个数据类。
3、基础用法
下面就要请出我们的 record 关键字了。
在jdk14,我们可以用record关键字替换重复的数据类。record是不可变的数据类,只需要字段的类型和名称。equals、hashCode和toString方法以及private、final字段和public的构造函数都是由Java编译器生成的。
下面我们来看看jdk14用record关键字怎么创建这个包含name和address的Person。
public record Person (String name, String address) {}
没错,就是这么简单的实现了。
3.1、生成的构造方法
用record关键字,创建出的构造方法如下:
public Person(String name, String address) {
this.name = name;
this.address = address;
}
record生成的构造方法,和一般的class的构造使用方式没什么区别:
Person person = new Person(“John Doe”, “100 Linda Ln.”);
作者ps:其实这里看生成的代码会发现,其实他是创建了个final的Person类,然后继承了java.lang.Record,不过Record类也是final的,我们自己写代码的时候是没法继承的。
3.2、生成的getters方法
用record关键字后,同样为我们生成了getters方法,只不过和我们传统使用的调用有点区别,看下面的测试用例:
@Test
public void givenValidNameAndAddress_whenGetNameAndAddress_thenExpectedValuesReturned() {
String name = “John Doe”;
String address = “100 Linda Ln.”;
Person person = new Person(name, address);
assertEquals(name, person.name());
assertEquals(address, person.address());
}
它生成的是不含get前缀的。
3.3、生成的equals方法
用record关键字后,同样为我们生成的对应的equals方法,测试用例如下:
@Test
public void givenSameNameAndAddress_whenEquals_thenPersonsEqual() {
String name = “John Doe”;
String address = “100 Linda Ln.”;
Person person1 = new Person(name, address);
Person person2 = new Person(name, address);
assertTrue(person1.equals(person2));
}
只要是同一个对象,或是每个字段都相等,就会是true。
3.4、生成的hashCode方法
和equals一样,为我们生成的hashCode方法,测试用例如下:
@Test
public void givenSameNameAndAddress_whenHashCode_thenPersonsEqual() {
String name = “John Doe”;
String address = “100 Linda Ln.”;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
Java架构进阶面试及知识点文档笔记
这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
互联网Java程序员面试必备问题解析及文档学习笔记
Java架构进阶视频解析合集
MySQL,Kafka等面试解析及知识点整理**
[外链图片转存中…(img-8mWAq00d-1711050425214)]
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
[外链图片转存中…(img-bPatuOLo-1711050425214)]
互联网Java程序员面试必备问题解析及文档学习笔记
[外链图片转存中…(img-fftLKAXG-1711050425215)]
Java架构进阶视频解析合集