【JDK17 | 14】Java 17 深入剖析:密封类

news2024/10/10 4:23:18

引言

Java 17引入了一项重要的新特性——密封类(Sealed Classes),这标志着Java在面向对象编程领域的又一次重大进步。密封类提供了一种机制来精确控制类的继承链,使得类的设计者能够明确规定哪些类能够继承或实现该类。

一、密封类的作用

在面向对象编程中,继承是一种常见的行为,它允许我们复用代码并扩展现有功能。然而,有时候我们希望限制这种继承行为,以确保类的使用不会超出我们的预期。密封类正是为了解决这个问题而设计的,它限制了类的继承,使得类的继承更加可预测和安全。

二、已有的限制手段

在Java中,我们已经有几种方式来限制类的继承:

  1. 使用final关键字修饰类,这样类就无法被继承。
  2. 将类设置为非public(即package-private),这样类只能被同一个包下的类继承。

但这两种方式的粒度都比较粗,如果需要更精细的控制,就显得力不从心了。

三、新特性:密封类

Java 17中的密封类引入了几个重要的关键词:

  • sealed:修饰类或接口,表示该类或接口是密封的。
  • non-sealed:修饰类或接口,表示该类或接口不是密封的。
  • permits:用在extendsimplements之后,指定可以继承或实现的类。

四、实战应用

4.1定义密封类

假设我们要设计一个游戏,游戏中的英雄分为三大类:坦克、输出和辅助。每个种类下又有各种不同的具体英雄。我们可以使用密封类来定义这样的结构:

public sealed class Hero permits TankHero, AttackHero, SupportHero {
    // 英雄基类
}

public non-sealed class TankHero extends Hero {
    // 坦克英雄的抽象
}

public non-sealed class AttackHero extends Hero {
    // 输出英雄的抽象
}

public non-sealed class SupportHero extends Hero {
    // 辅助英雄的抽象
}

public final class Alistar extends TankHero {
    // 坦克英雄:阿利斯塔
}

public final class Ezreal extends AttackHero {
    // 输出英雄:伊泽瑞尔
}

public final class Soraka extends SupportHero {
    // 辅助英雄:索拉卡
}

通过这种方式,我们确保了Hero类的继承是受控的,只有TankHeroAttackHeroSupportHero可以继承它,而具体的英雄实现则被标记为final,防止进一步的继承。

4.2密封类与模式匹配

密封类与Java的模式匹配(Pattern Matching)相结合,可以提供更强的类型安全和代码清晰度。例如,我们可以在switch语句中使用模式匹配来处理密封类的不同子类:

Shape rotate(Shape shape, double angle) {
    return switch (shape) {
        case Circle c -> c;
        case Rectangle r -> shape.rotate(angle);
        case Square s -> shape.rotate(angle);
    };
}

这种模式匹配确保了所有可能的子类都被覆盖,如果缺少任何一个子类,编译器将会发出错误。

五、应用场景

5.1. 图形库设计

在设计图形库时,我们可能只想允许特定的几何形状类继承一个基类。例如,我们有一个Shape基类,我们只想允许CircleSquare继承它:

public sealed class Shape permits Circle, Square {
    // Shape类的实现
}

public final class Circle extends Shape {
    // Circle类的实现
}

public final class Square extends Shape {
    // Square类的实现
}

在这个场景中,密封类确保了Shape类的继承是受控的,防止了意外的类扩展,提高了库的可靠性和一致性。

5.2. 游戏角色设计

在游戏开发中,我们可能需要定义不同类型的角色,例如坦克、输出和辅助角色,并且每个类别下有具体的实现。使用密封类可以确保角色类的继承结构清晰:

public sealed class Hero permits TankHero, AttackHero, SupportHero {
    // 英雄基类的实现
}

public non-sealed class TankHero extends Hero {
    // 坦克英雄的实现
}

public non-sealed class AttackHero extends Hero {
    // 输出英雄的实现
}

public non-sealed class SupportHero extends Hero {
    // 辅助英雄的实现
}

在这个例子中,Hero类被密封,并且只有TankHeroAttackHeroSupportHero可以继承它。这样的设计有助于维护游戏角色的一致性和可管理性。

5.3. 表达式解析

在构建表达式解析器时,我们可能需要定义一个表达式接口,并且只允许特定的表达式类实现它。例如,一个简单的数学表达式解析器可能只允许ConstantExprPlusExprTimesExpr实现Expr接口:

public sealed interface Expr permits ConstantExpr, PlusExpr, TimesExpr {
    int eval();
}

public final class ConstantExpr implements Expr {
    int value;
    public ConstantExpr(int value) {
        this.value = value;
    }
    public int eval() {
        return value;
    }
}

public final class PlusExpr implements Expr {
    Expr left, right;
    public PlusExpr(Expr left, Expr right) {
        this.left = left;
        this.right = right;
    }
    public int eval() {
        return left.eval() + right.eval();
    }
}

在这个场景中,密封接口限制了表达式的类型,使得表达式的处理更加安全和可预测。

六、实战指南

6.1定义密封类

要定义一个密封类,你需要使用sealed关键字,并在permits子句中指定允许的子类:

public sealed class MyClass permits ClassA, ClassB {
    // 类的实现
}

6.2 定义密封接口

定义密封接口的方式与密封类类似,但是用于接口:

public sealed interface MyInterface permits ClassA, InterfaceB {
    // 接口的定义
}

6.3 使用模式匹配

Java的模式匹配可以用来处理密封类的不同子类,提高代码的可读性和安全性:

public void handleShape(Shape shape) {
    switch (shape) {
        case Circle circle -> System.out.println("Circle with radius " + circle.radius);
        case Square square -> System.out.println("Square with side " + square.side);
    }
}

6.4 兼容性和反射

密封类与Java的反射API兼容,你可以使用isSealed()getPermittedSubclasses()方法来检查密封类的状态和获取允许的子类列表:

if (Shape.class.isSealed()) {
    System.out.println("Shape is sealed.");
    Class<?>[] subclasses = Shape.class.getPermittedSubclasses();
    System.out.println("Permitted subclasses: " + Arrays.toString(subclasses));
}

七、总结

密封类为Java带来了一种新的控制继承的方式,它提高了代码的安全性和可维护性。通过限制类的继承,我们可以构建更加健壮和可预测的系统。随着Java语言的不断发展,密封类将成为面向对象编程中不可或缺的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity转Unreal5之从入门到精通 Spline(样条曲线)组件的使用

前言 Spline 组件 能编辑 样条曲线,定义一条路径,路径上的点可以通过距离起点的长度获取,因此可以实现 物体沿路径连续移动 的效果或者 物体沿路径分布 的效果。 今天我们就来实现一个简单的Spline样条曲线的Demo 实现一个沿路径运动的功能 1.新建一个基于 Actor 的蓝图…

JavaSE——集合1:Collection接口(Iterator和增强for遍历集合)

目录 一、集合框架体系(重要) 二、集合引入 (一)集合的理解与好处 三、Collection接口 (一)Collection接口实现类的特点 (二)Collection接口常用方法 (三)Collection接口遍历元素的方式(Iterator和增强for) 1.使用Iterator(迭代器) 1.1Iterator(迭代器)介绍 1.2Itera…

使用cv::FileStorage对yaml文件进行读写

问题描述&#xff1a;记录使用cv::FileStorage对yaml文件进行读写 参考官网&#xff1a;OpenCV: cv::FileStorage Class Reference WRITE&#xff1a;根据文件路径写文件&#xff0c;如果文件不存在会新建&#xff0c;文件存在则变空白 FileStorage fs(filepath, FileStorag…

新增数据集 SDK、“关系抽取”文本标注、优化模型监控和管理|ModelWhale 版本更新

ModelWhale 带来了新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 数据管理&#xff1a;新增 mw_python_sdk 支持通过查看、下载、制作、更新数据集 文本标注&#xff1a;新增“关系抽取…

【DFDT】DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer

文章目录 DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformerkey points贡献方法补丁提取和嵌入基于注意力的补丁选择多流transformer块多尺度分类器实验DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer 会议/期刊:App…

Apache Linkis + OceanBase:如何提升数据分析效率

计算中间件 Apache Linkis 构建了一个计算中间件层&#xff0c;以实现上层应用程序和底层数据引擎之间的连接、治理和编排。目前&#xff0c;已经支持通过数据源的功能&#xff0c;实现用户通过Linkis 对接并使用 OceanBase数据库。 本文详细阐述了在 Apache Linkis v1.3.2中&a…

【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

【虚拟化】内核级虚拟化技术KVM介绍&#xff0c;全/半虚拟化的区别&#xff0c;使用libvirt搭建虚拟化平台&#xff08;go/java/c&#xff09; 文章目录 1、虚拟化技术分类与架构&#xff08;KVM&#xff0c;Xen&#xff09;&#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十四章 安装 Samba

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

举个栗子!Tableau 技巧(283):用山丘图呈现项目周期

人们常常用爬山来比喻工作中做项目的过程&#xff1a;明确目标、规划路线、团队合作、应对挑战&#xff0c;然后享受登顶并在下山后总结经验教训。 图片来自网络 在 Tableau 中做项目分析时&#xff0c;将一段时期的项目用山丘图来呈现&#xff0c;山丘大小代表项目周期的时间…

RAG(Retrieval-Augmented Generation,检索增强生成)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合信息检索与生成式模型的混合架构&#xff0c;旨在提升自然语言生成任务的准确性、丰富性和知识覆盖范围。它通过在生成过程…

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…

基于Vue3+pinia+vue-router+axios+element-plus等开发的新闻发布管理系统

新闻发布管理系统是一个基于Vue3piniavue-routeraxioselement-plus等开发的系统&#xff0c;主要功能包括&#xff1a;登录模块、注册模块、新闻分类管理模块、新闻管理模块、个人中心模块&#xff08;包括基本资料、更换头像、重置密码功能&#xff09;等。 代码下载&#xf…

指针式表盘指针关键部位分割系统源码&数据集分享

指针式表盘指针关键部位分割系统源码&#xff06;数据集分享 [yolov8-seg-LSKNet&#xff06;yolov8-seg-C2f-EMSC等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Gl…

MAX模型转为las点云模型

在做一个小项目&#xff0c;探测闯入的野生动物。在做案例&#xff0c;需要用到一些野生动物的点云模型。公开的模型像斯坦福等学术机构&#xff0c;以及Thingiverse、Digital Morphology都没有合适的。但是在一些3d数据库中可以下载到max模型&#xff0c;如图1所示。通过3dmax…

英伟达RTX 5090和RTX 5080

英伟达RTX 5090和RTX 5080 一、英伟达RTX 5090和RTX 5080显卡参数的更为详细的介绍&#xff1a; RTX 5090 显卡参数 GPU核心与架构 核心代号&#xff1a;GB202-300-A1。 架构&#xff1a;Blackwell架构&#xff0c;这是英伟达最新的显卡架构&#xff0c;旨在提供更高的性能…

C++内部类和匿名对象

1.内部类 内部类就是定义在一个类的内部的类&#xff0c;比如 #include<iostream> using namespace std; class AA{ public:class BB {public:void print(const AA& A){cout << A.aa1 << " " << A.aa2 << endl;}private:}; priv…

RabbitMQ初识

目录 Kafka RocketMQ RabbitMQ MQ界面(它使用的端口号5672&#xff0c;界面是15672&#xff09; 如何添加一个虚拟机&#xff0c;点击右侧 Topics&#xff08;通配符模式&#xff09; 发布确认机制 持久性(可靠性保证的机制之一) JDK17,Linux服务器Ubuntu 什么是MQ 实…

recyclerView(kotlin)

recyclerView的优点 使用viewHolderRecycledViewPool的方式复用资源&#xff0c;提高性能利用LayoutManager&#xff0c;可根据不同需求使用不同的布局&#xff0c;且可以方便使用对应布局提供的方法&#xff0c;如快速定位item等。RecyclerView 提供了一个 ItemAnimator 接口…

msvcp110丢失怎么解决?三种方法教你修复msvcp110.dll丢失

1. msvcp110.dll 概述 1.1 定义与作用 msvcp110.dll 是 Microsoft Visual C 2012 Redistributable Package 的一部分&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;对运行时环境至关重要。这个文件包含了 C 标准库的实现&#xff0c;为基于 Vis…

ssm智能社区管理系统的设计与实现

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B…