【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,则该子类并无限制,与普通的类无异.
相关文章
|
5月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
328 1
|
5月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
493 0
|
5月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
564 8
|
5月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
228 4
|
5月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
296 5
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
281 1
|
5月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
402 1
|
5月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
272 1
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
215 7
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
783 58