用 record 修饰一个类,括号里面直接带参数,{}
里面是可选的。
到底有啥用呢?
最好理解它的方式就是实践,下面栈长通过一个示例带大家来了解下。
实践分析
怎么安装 Java 14 及环境配置这篇就不说了。
下面是一个示例:
public record Student(String name, int id, int age) {}
没错,一行搞定(public 都可以省略),就是这么简单粗暴!!!
再来看下它的类继承结构图:
我们再通过 IDEA 反编译 class 类的方式来看下它到底做了什么:
看完是不是有点 Lombok 的感觉?
1)生成的类是 final 类型的,并且继承了:java.lang.Record
;
2)生成的类成员变量全是 private final 类型的;
3)自动生成了类构造器、toString()、hashCode()、equals(),以及类似 getter
的变量访问方法;
由于工具编译器的问题,上边看到的部分源代码是 /* compiled code */
,我们再在 Student 类里面加入 main 方法测试下:
public record Student(String name, int id, int age) {
public static void main(String[] args) {
Student student1 = new Student(“栈长”, 1001, 18);
System.out.println(student1.name());
System.out.println(student1.id());
System.out.println(student1.age());
System.out.println(student1);
Student student2 = new Student(“栈长”, 1001, 18);
Student student3 = new Student(“栈长”, 1003, 18);
System.out.println(student1.equals(student2));
System.out.println(student1.equals(student3));
}
}
输出结果:
栈长
1001
18
Student[name=栈长, id=1001, age=18]
true
false
从结果可以得知 toString/ equals 等生成的方法都按照特定的规则重写了,而不是使用内存地址。
可以添加成员变量吗?
不能,Records类里面不能手动加成员变量。
比如,加一个地址成员变量就编译报错了:
可以代替 Lombok 吗?
答案是:不能完全代替!
从上面的结论我们可以得知 Records 类有以下限制:
1)record 类是 final 修饰的,所以不能被其他子类继承;
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
答案是:不能完全代替!
从上面的结论我们可以得知 Records 类有以下限制:
1)record 类是 final 修饰的,所以不能被其他子类继承;
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
[外链图片转存中…(img-1iqYyJ0W-1714303133182)]