封闭类:怎么刹住失控的扩展性

一个可扩展的类,子类和父类可能会相互影响,从而导致不可预知的行为。涉及敏感信息的类,增加可扩展性不一定是个优先选项,要尽量避免父类或者子类的影响。

使用类修饰符 sealed 修饰的类是封闭类;使用类修饰符 sealed 修饰的接口是封闭接口。封闭类和封闭接口限制可以扩展或实现它们的其他类或接口。

封闭类的声明使用 sealed 类修饰符,然后在所有的 extends 和 implements 语句之后,使用 permits 指定允许扩展该封闭类的子类。

js 复制代码
package co.ivi.jus.sealed.modern;

public abstract sealed class Shape permits Circle, Square {
    public final String id;

    public Shape(String id) {
        this.id = id;
    }

    public abstract double area();
}

由 permits 关键字指定的许可子类(permitted subclasses),必须和封闭类处于同一模块(module)或者包空间(package)里。

在编译期为封闭类添加上许可的子类。

许可类的声明需要满足下面的三个条件:

  1. 许可类必须和封闭类处于同一模块(module)或者包空间(package)里,也就是说,在编译的时候,封闭类必须可以访问它的许可类;
  2. 许可类必须是封闭类的直接扩展类;
  3. 许可类必须声明是否继续保持封闭:
    • 许可类可以声明为终极类(final),从而关闭扩展性;
    • 许可类可以声明为封闭类(sealed),从而延续受限制的扩展性;
    • 许可类可以声明为解封类(non-sealed), 从而支持不受限制的扩展性。

由于许可类必须是封闭类的直接扩展,因此许可类不具备传递性。


此文章为9月Day6学习笔记,内容来源于极客时间《深入剖析 Java 新特性》

相关推荐
码事漫谈3 小时前
大模型输出的“隐性结构塌缩”问题及对策
前端·后端
小江的记录本3 小时前
【网络安全】《网络安全常见攻击与防御》(附:《六大攻击核心特性横向对比表》)
java·网络·人工智能·后端·python·安全·web安全
努力的小雨4 小时前
龙虾量化实战法(QClaw)
后端
橙露4 小时前
SpringBoot 整合 MinIO:分布式文件存储上传下载
spring boot·分布式·后端
2401_895521345 小时前
【Spring Security系列】Spring Security 过滤器详解与基于JDBC的认证实现
java·后端·spring
小码哥_常6 小时前
大文件上传不再卡顿:Spring Boot 分片上传、断点续传与进度条实现全解析
后端
_Evan_Yao6 小时前
RAG中的“Chunk”艺术:我试过10种切分策略后总结的结论
java·人工智能·后端·python·软件工程
今天你TLE了吗7 小时前
LLM到Agent&RAG——AI概念概述 第二章:提示词
人工智能·笔记·后端·学习
IT_陈寒7 小时前
Vue的响应式把我坑惨了,原来问题出在这
前端·人工智能·后端
shark22222228 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式