【JAVA学习之路 | 进阶篇】Record(记录)与密封类(sealed)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值