Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360、JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409。Sealed Classes有两种主流翻译:密封类、封闭类。个人喜欢前者多一些,所以在本文中都称为密封类。其实Sealed Classes的其他许多语言中并不是什么新鲜事物,C#、Scala等高级语言中都有类似的名称,但意义和作用各不相同。下面就来一起认识一下Java 17中的Sealed Classes。
密封类的作用
在面向对象语言中,我们可以通过继承(extend)来实现类的能力复用、扩展与增强。但有的时候,有些能力我们不希望被继承了去做一些不可预知的扩展。所以,我们需要对继承关系有一些限制的控制手段。而密封类的作用就是 限制类的继承。
已有的限制手段
对于继承能力的控制,Java很早就已经有一些了,主要是这两种方式:
final
修饰类,这样类就无法被继承了package-private
类(非public类),可以控制只能被同一个包下的类继承
但很明显,这两个限制的粒度都很粗,如果再细化一些限制就很难实现。
[En]
However, it is clear that the granularity of both restrictions is very coarse, and it is difficult to achieve if there are more refined restrictions.
新特性:密封类
为了进一步增强限制能力,Java 17中的密封类增加了几个重要关键词:
sealed
:修饰类/接口,用来描述这个类/接口为密封类/接口
相关文章
Mybatis逆向工程配置
Mybatis 提供了一个逆向工程工具,该工具可以根据数据表自动生成针对单表的 po 类、mapper 映射文件和 mapper 接口。大大缩减了开发时间,可以让开发人员将更多的精力放在繁杂的业务逻辑...
注意:Spring Boot 2.7开始spring.factories不推荐使用了,接下来这么玩…
如果你是Spring Boot用户的话,一定有这样的开发体验,当我们要引入某个功能的时候,只需要在maven或gradle的配置中直接引入对应的Starter,马上就可以使用了,而不需要像传统Spri...
自己动手实现AQS(一) AQS互斥模式与ReentrantLock可重入锁原理解析
1. MyAQS介绍 在这个系列博客中,我们会参考着jdk的AbstractQueuedLongSynchronizer,从零开始自己动手实现一个AQS(MyAQS)。通过模仿,自己造轮子来学习主要有...
Java学习 (16) Java方法篇(03)递归
递归 语法实例 递归与循环的区别 递归优缺点 循环优缺点 递归 递归就是就是自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的...
【Unity】在Unity中通过触发播放音频
1、创建音频播放组件 首先在Hierarchy窗口中新建空组件。 选中新建的组件,在Inspector窗口中添加组件"Audio Source",并将要播放的音乐拖入其"Audio Clip"属性。 ...
mybatis中复杂查询(多对一和一对多)1-环境搭建
一.基本知识 (1).多对一的理解(以学生和老师为例子) 老师角度:一个老师会教多个学生【一对多】 学生角度:多个学生对应一个老师【多对一】 (2).如何处理:比较常见的两种方式,一个是联表查询,一个...
spring 配置文件 –bean
bean标配的基本配置 id:Bean实例在Spring容器中的唯一标识 class Bean的全限定名 scope 1.当scope的取值为singleton时 Bean的实例化个数: 1个 Bea...
Netty源码分析之ByteBuf(二)—内存分配器ByteBufAllocator
Netty中的内存分配是基于ByteBufAllocator这个接口实现的,通过对它的具体实现,可以用来分配我们之前描述过的任意类型的BytebBuf实例;我们先看一下ByteBufAllocator...
rabbitmq 安装
rabbitmq 安装 官网地址 https://rabbitmq.com/download.html 前言 RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写, 即需要先...
【Unity Shader学习笔记】Unity光照-阴影
1、原理 一个对象在其他对象上投射阴影,以及一个对象如何接收其他对象的阴影。[En]One object casts shadows on other objects, and how one obj...
Netty源码分析之ByteBuf引用计数
引用计数是一种常用的内存管理机制,是指将资源的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。Netty在4.x版本开始使用引用计数机制进行部分对象的管理,其实现思路并不是特别复杂,它主要涉...
哪有什么引用传递,所有都是值传递
人们经常看到,价值转移和参考转移实际上是价值转移,但区别仅在于转移的价值类型。[En]It is often seen that value transfer and reference transf...
Spring Bean生命周期
本文基于图灵课堂周瑜老师的讲解整理,包括spring bean加载的过程,主要是扫描BeanDefinition以及初始化非懒加载单例Bean两部分,源码取自SpringFramework 5.3.2...
15分钟学会JWT使用
什么是JWT? JSON Web Token ,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。 jwt 可以生成 一个加密的token,做为用户登录的令牌,当用户登录成...