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

简介: 【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,则该子类并无限制,与普通的类无异.
相关文章
|
1天前
|
设计模式 Java 容器
在Java中调用一个接口的多个实现类
在Java中调用一个接口的多个实现类
10 4
|
1天前
|
安全 Java 数据安全/隐私保护
Java基础之类封装、继承、多态
Java基础的封装、继承和多态是OOP的核心。封装通过访问控制(如private)隐藏类的内部细节,提供公共接口供外部交互。例如,`Person`类封装`name`和`age`,通过`getName()`和`setAge()`方法访问。继承允许子类(如`Dog`)继承父类(如`Animal`)的属性和方法,并可扩展或覆盖。多态使得父类引用可指向子类对象,调用方法时根据实际对象类型执行,如不同动物的`makeSound()`。接口实现多态提供了一种定义行为而不必关心实现的方式。向上转型(子类→父类)安全且默认,而向下转型(父类→子类)需类型检查以避免异常。
6 1
|
1天前
|
Java 数据安全/隐私保护
Java基础之类封装、继承、多态
Java基础之类封装、继承、多态
8 2
|
1天前
|
存储 安全 Java
Java集合类是Java编程语言中用于存储和操作一组对象的工具
【6月更文挑战第19天】Java集合类,如`List`、`Set`、`Map`在`java.util`包中,提供高级数据结构。常用实现包括`ArrayList`(快速随机访问)、`LinkedList`(高效插入删除)、`HashSet`(无序不重复)、`TreeSet`(排序)、`HashMap`(键值对)和`TreeMap`(排序映射)。集合动态调整大小,支持对象引用,部分保证顺序。选择合适集合优化性能和数据组织。
7 1
|
2天前
|
Java 大数据 API
|
2天前
|
安全 Java 开发者
类与对象:Java中的封装、继承与多态
Java面向对象三大特性:封装(隐藏对象细节,增强安全与复用),继承(代码复用与扩展,如Dog继承Animal),多态(统一接口,不同实现,如Playable接口的Piano和Guitar)。通过示例展示了如何在实践中应用这些概念。【6月更文挑战第16天】
12 2
|
3天前
|
Java
在 Java 中,类是一种定义对象的模板,它包含数据成员(字段)和方法。
在 Java 中,类是一种定义对象的模板,它包含数据成员(字段)和方法。
|
1天前
|
Java 开发者
线程的诞生之路:Java多线程创建方法的抉择与智慧
【6月更文挑战第19天】Java多线程编程中,开发者可选择继承Thread类或实现Runnable接口。继承Thread直接但受限于单继承,适合简单场景;实现Runnable更灵活,支持代码复用,适用于如银行转账这类需多线程处理的复杂任务。在资源管理和任务执行控制上,Runnable接口通常更优。
|
1天前
|
Java
Java 多线程新手必读:线程的创建技巧与陷阱
【6月更文挑战第19天】Java多线程初学者须知:创建线程可通过继承`Thread`或实现`Runnable`接口。继承`Thread`限制单继承,实现`Runnable`更灵活。记得调用`start()`而非`run()`启动线程,避免并发问题时需正确同步共享资源。示例代码展示两种创建方式及未同步导致的问题。
|
1天前
|
Java
揭秘!为何Java多线程中,继承Thread不如实现Runnable?
【6月更文挑战第19天】在Java多线程中,实现`Runnable`比继承`Thread`更佳,因Java单继承限制,`Runnable`可实现接口复用,便于线程池管理,并分离任务与线程,提高灵活性。当需要创建线程或考虑代码复用时,实现`Runnable`是更好的选择。