Java sealed 关键字是 JDK 17 引入的类型控制机制,用于精准约束类/接口的继承体系,其核心设计与特性如下:
一、基本语法
public sealed class Shape permits Circle, Rectangle, Triangle { // 明确允许子类
// 父类定义...
}
- 限制继承:仅通过
permits列举的类可继承父类 - 强制封闭:所有子类必须显式声明为
final、sealed或non-sealed - 模块管控:父类与子类必须位于同一模块或包内
二、核心特性
-
受限扩展体系
- 防止不可控的类扩展,例如在 JSON-RPC 协议中限定只有三类消息实体可继承基础接口
JSONRPCMessage - 编译时强制校验继承关系,避免运行时出现不可预期的子类型
- 防止不可控的类扩展,例如在 JSON-RPC 协议中限定只有三类消息实体可继承基础接口
-
显式许可机制
public sealed interface Transport permits Airplane, Train { void move(); }所有实现类必须直接声明在
permits列表中,否则引发编译错误 -
模式匹配优化
if (shape instanceof Circle c) { System.out.println("Radius: " + c.radius()); }配合
sealed可确保switch表达式覆盖所有可能子类,提升代码安全性
三、典型应用场景
| 场景类型 | 说明 | 示例引用 |
|---|---|---|
| 协议实现 | 强制特定消息结构符合规范,如 JSON-RPC 的三类消息实体定义 | JSONRPCRequest 请求体 |
| 领域建模 | 限定核心业务模型的扩展边界,如电商系统中的支付方式体系 | PaymentMethod 继承体系 |
| API 安全控制 | 防止第三方库意外扩展关键接口 | 框架核心接口定义 |
四、对比其他类型控制关键字
| 关键字 | 继承控制强度 | 典型场景 |
|---|---|---|
final | 完全禁止扩展 | 工具类、不可变类(如 String) |
sealed | 有限允许扩展 | 协议实现、领域模型(如支付方式体系)7 |
| 非密封类 | 完全开放扩展 | 常规类继承体系 |
通过 sealed 可构建既安全又灵活的类层次结构,是构建严谨领域模型的核心语言特性。