Mushroom Notes Mushroom Notes
🍄首页
  • JavaSE

    • 基础篇
    • 数据结构
    • IO流
    • Stream流
    • 函数式接口
    • JUC
    • 反射
    • 网络编程
    • 设计模式
  • JavaEE

    • Servlet
    • JDBC
    • 会话技术
    • 过滤器监听器
    • 三层架构
  • JDK

    • 总览
  • JVM

    • 总览
  • 常用mate
  • CSS
  • JavaScript
  • rds 数据库

    • MySQL
    • MySQL 进阶
    • MySQL 库表规范
  • nosql 数据库

    • Redis
    • Redis 进阶
    • Redis 底层
    • MongoDB
  • Spring生态

    • Spring
    • Spring MVC
    • Spring boot
    • Spring Validation
  • Spring Cloud生态

    • Spring Cloud
    • 服务治理
    • 远程调用
    • 网关路由
    • 服务保护
    • 分布式事务
    • 消息中间件
  • 数据库

    • Mybatis
    • Mybatis Plus
    • Elasticsearch
    • Redisson
  • 通信

    • Netty
📚技术
  • 方案专题
  • 算法专题
  • BUG专题
  • 安装专题
  • 网安专题
  • 面试专题
  • 常用网站
  • 后端常用
  • 前端常用
  • 分类
  • 标签
  • 归档

kinoko

一位兴趣使然的热心码农
🍄首页
  • JavaSE

    • 基础篇
    • 数据结构
    • IO流
    • Stream流
    • 函数式接口
    • JUC
    • 反射
    • 网络编程
    • 设计模式
  • JavaEE

    • Servlet
    • JDBC
    • 会话技术
    • 过滤器监听器
    • 三层架构
  • JDK

    • 总览
  • JVM

    • 总览
  • 常用mate
  • CSS
  • JavaScript
  • rds 数据库

    • MySQL
    • MySQL 进阶
    • MySQL 库表规范
  • nosql 数据库

    • Redis
    • Redis 进阶
    • Redis 底层
    • MongoDB
  • Spring生态

    • Spring
    • Spring MVC
    • Spring boot
    • Spring Validation
  • Spring Cloud生态

    • Spring Cloud
    • 服务治理
    • 远程调用
    • 网关路由
    • 服务保护
    • 分布式事务
    • 消息中间件
  • 数据库

    • Mybatis
    • Mybatis Plus
    • Elasticsearch
    • Redisson
  • 通信

    • Netty
📚技术
  • 方案专题
  • 算法专题
  • BUG专题
  • 安装专题
  • 网安专题
  • 面试专题
  • 常用网站
  • 后端常用
  • 前端常用
  • 分类
  • 标签
  • 归档
  • JavaSE

  • JavaEE

  • JDK版本特性

    • 总览
    • Java8

    • Java 17

      • java 17 - 增强型伪随机数生成器
      • java 17 - 增强 switch表达式
      • java 17 - 文本块优化
      • java 17 - 日期周期&数字格式化
      • java 17 - 密封类 sealed class
        • 示例
      • java 17 - ZGC 的改进
      • java 17 - record 关键字
      • java 17 - instanceof模式匹配
      • java 17 - HTTP 客户端改进
    • Java 21

  • JVM

  • Java
  • JDK版本特性
  • Java 17
kinoko
2024-01-11
目录

java 17 - 密封类 sealed class


sealed关键字通常用于编程语言中的类、接口,其作用是限制这些类、接口的继承、实现或重写范围。它可以确保在同一个编译单元内所有相关的类都能被看到,并且不会被外部代码所继承、实现或重写。密封类或许对于框架或中间件的开发者更有用,它能够更加细粒度的控制继承结构。
sealed具有以下特性:

  1. 子类范围限定:密封类通过 permits 关键字指定允许继承它的具体子类。只有这些指定的子类可以继承密封类,其他类则不能。
  2. 细化类型检查:使用密封类可以帮助编译器进行更细致的类型检查,因为在编译期间可以明确知道哪些类是密封类的子类,从而提供更严格的类型安全性。
  3. 支持模式匹配:Java 17 引入了模式匹配的增强功能,密封类与模式匹配结合可以更方便地进行类型判断和分支处理,提高代码的可读性和易维护性。

# 示例


要使用 sealed 关键字,可以按照以下的语法格式:

// 类
public sealed class Shape permits Circle, Square, Triangle {
    // class definition
}
// 接口
public sealed interface Service permits AServiceImpl, BServiceImpl {
    // interface definition
}
1
2
3
4
5
6
7
8

使用 permits 关键字列出了允许继承 Shape 的类,即 Circle、Square 和 Triangle。这意味着只有这些列出的类才能继承 Shape,其他类则不能。

  • permits 关键字声明的类必须是直接子类
  • 密封类不支持匿名类和函数式接口

对于继承自密封类的子类,必须是final、non-sealed、sealed的一种,例如:

public final class Circle extends Shape {
    // class definition
}
1
2
3

在 Java 中,如果一个子类继承自密封类并且被标记为终态 final,那么它具有以下特性:

  1. 不可再被继承:被标记为 final 的类表示它是最终的,不能被其他类所继承。这意味着该类的继承结构已经到达了终点,不能再派生出新的子类。
  2. 提高安全性:将子类标记为 final 可以提高程序的安全性,因为它确保了这个子类不会有任何派生类来改变其行为或添加新的属性。
  3. 显式表达设计意图:通过将类标记为 final,开发者可以明确地表达出他们的设计意图,即不希望该类被继承,从而使代码更易于理解和维护。
public non-sealed class CustomPolygon extends Shape {
    // class definition
}
1
2
3

如果一个类继承自密封类并且被标记为 non-sealed,则该子类具有以下特性:

  1. 允许进一步继承:将子类标记为 non-sealed 表示允许其他类继承它。这意味着该子类的下一级子类可以是任何类,不受继承约束。
  2. 灵活性增加:non-sealed 子类的出现使得继承体系更加灵活,允许在下一级子类中定义新的类来扩展功能或引入新行为。
  3. 可以被实例化:与 sealed 类及其 permitted 子类不同,non-sealed 子类可以被直接实例化,而不需要专门的工厂方法或构造器。
  4. 适用于桥接模式等场景:在某些设计模式或需求下,可能需要允许进一步继承,这时使用 non-sealed 类可以很好地满足这种需求,例如桥接模式中的抽象部分。
#java#jdk17
上次更新: 2024/01/11 17:06:16
java 17 - 日期周期&数字格式化
java 17 - ZGC 的改进

← java 17 - 日期周期&数字格式化 java 17 - ZGC 的改进→

最近更新
01
JVM 底层
09-13
02
JVM 理论
09-13
03
JVM 应用
09-13
更多文章>
Theme by Vdoing | Copyright © 2022-2024 kinoko | MIT License | 粤ICP备2024165634号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式