1.Recode记录
(1). 前言
- Recode是一种特殊的类,在java1.4时被引入.
- 其出现的原因是我们在编写JavaBean代码时我们会写出很多繁冗的代码(诸如getter/setter方法,重载的构造器,重写的hashCode()等等),为了解决这个问题,引入了Recode记录.
(2). 例 :
在引入记录前 :
public class Employee {
int age;
String name;
public Employee() {
System.out.println("调用了空参构造器");
}
public Employee(int age, String name) {
System.out.println("调用了有两个参数的构造器");
this.age = age;
this.name = name;
}
public Employee(int age) {
System.out.println("调用了一个参数构造器");
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return age == employee.age && Objects.equals(name, employee.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public String toString() {
return "Employee{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
在引入Recode后 :
public record Emp(int age, String name) {
}
Recode提供了构造器public Emp(int age, String name), getter()方法(注意没有setter()方法)等.
Test :
class RecodeTest{
public static void main(String[] args) {
Emp e = new Emp(20, "hexua");
//默认调用e对象的重写的toString方法
System.out.println(e);
//获取age :
System.out.println("年龄是" + e.age());
//获取name :
System.out.println("名字是" + e.age());
}
}
控制台 :
Emp[age=20, name=hexua]
年龄是20
名字是20
注 :
- 不能显式继承其他类.
- JavaBean是可变的,而recode是不可变的.所以不可以用recode来替代JavaBean的功能.
2.密封类(sealed关键字)
密封类是java17中引入的一个新特性,用于限制类的继承.密封类可以防止其他类继承它们.从而确保更好的类型安全性和性能.
例 :
//sealed修饰表明该类是密封类, permits指定了由哪些类来继承
sealed class Class1 permits Class2, Class3{
}
//Class2继承了Class1, 必须对Class1的子类进行限制, 选择其子类是由sealed修饰, 还是final, non-sealed
final class Class2 extends Class1{
}
non-sealed class Class3 extends Class1 {
}
注 :
- 密封类可以permits指定可以由哪些类来继承该密封类.permits指定后,其子类必须显式extends继承该密封类.且其子类需要选择声明为sealed/non-sealed/final.
- 如果其子类声明为sealed,则其子类也为密封类,可以指定由哪些类继承.
- 如果其子类声明为final,说明该子类不能被继承.
- 如果其子类声明为non-sealed,则该子类并无限制,与普通的类无异.