第六讲Record
视频课:https://edu.****.net/lecturer/1516
历史渊源:
JEP359:
JEP384:
疫情原因,欧美程序员没有变化。
2019,java语言架构师,Brian Goetz,“太啰嗦、繁文缛节”。创建纯粹的数据类,大量低价值、重复、易出错的代码:构造方法、getter/setter、equals、hashCode()、ToString()。
一.概念
是一种轻量级的class,可以看作数据结构体,是一种形式受限制的类。
public class Person {
private int id;
private String name;
//合作者:搭档;
private Person parter;
public Person getParter() {
return parter;
}
public void setParter(Person parter) {
this.parter = parter;
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public Person(int id, String name, Person parter) {
this.id = id;
this.name = name;
this.parter = parter;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Persson{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
简化写法,Lombok,注解生成,构造方法、存取方法,代码看不到,调试有劣势。
二.语法
public record Person(int id,String name,Person parter) {
}
反编译之后:
public final class Person extends java.lang.Record {
private final int id;
private final java.lang.String name;
private final Person parter;
public Person(int id, java.lang.String name, Person parter) { /* compiled code */ }
public final java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int id() { /* compiled code */ }
public java.lang.String name() { /* compiled code */ }
public Person parter() { /* compiled code */ }
}
结论:
record字段都是final,初始化的设置,是不可改变的。
三.注意事项
3.1 不能继承自其他类
3.2不是使用abstract修饰
3.3 实例字段不允许,静态字段允许
3.4重写了equals()和hashCode()
3.5构造方法、静态方法、实例方法都允许存在;
四.具体使用
import java.util.HashSet;
public class TestPerson {
public static void main(String[] args) {
Person p1=new Person(1,"张三",new Person(2,"潇潇",null));
System.out.println(p1.toString());
System.out.println(p1.name());
System.out.println(p1); //code 3
System.out.println(p1.getClass());
//HashSet来测试,是否重写了
HashSet<Person>set=new HashSet<>();
set.add(p1);
Person p2=new Person(1,"张三",new Person(2,"潇潇",null));
set.add(p2);
//测试输出;JDK8 方法引用
set.forEach(System.out::println);
}
}