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,则该子类并无限制,与普通的类无异.