JDK17 sealed 详解

209 阅读2分钟

Java sealed 关键字是 JDK 17 引入的类型控制机制,用于精准约束类/接口的继承体系,其核心设计与特性如下:


一、基本语法

public sealed class Shape permits Circle, Rectangle, Triangle {  // 明确允许子类
    // 父类定义...
}
  • 限制继承‌:仅通过 permits 列举的类可继承父类
  • 强制封闭‌:所有子类必须显式声明为 finalsealed 或 non-sealed
  • 模块管控‌:父类与子类必须位于同一模块或包内

二、核心特性

  1. 受限扩展体系

    • 防止不可控的类扩展,例如在 JSON-RPC 协议中限定只有三类消息实体可继承基础接口 JSONRPCMessage
    • 编译时强制校验继承关系,避免运行时出现不可预期的子类型
  2. 显式许可机制

    public sealed interface Transport permits Airplane, Train {
        void move();
    }
    

    所有实现类必须直接声明在 permits 列表中,否则引发编译错误

  3. 模式匹配优化

    if (shape instanceof Circle c) {
        System.out.println("Radius: " + c.radius());
    }
    

    配合 sealed 可确保 switch 表达式覆盖所有可能子类,提升代码安全性


三、典型应用场景

场景类型说明示例引用
协议实现强制特定消息结构符合规范,如 JSON-RPC 的三类消息实体定义JSONRPCRequest 请求体
领域建模限定核心业务模型的扩展边界,如电商系统中的支付方式体系PaymentMethod 继承体系
API 安全控制防止第三方库意外扩展关键接口框架核心接口定义

四、对比其他类型控制关键字

关键字继承控制强度典型场景
final完全禁止扩展工具类、不可变类(如 String
sealed有限允许扩展协议实现、领域模型(如支付方式体系)7
非密封类完全开放扩展常规类继承体系

通过 sealed 可构建既安全又灵活的类层次结构,是构建严谨领域模型的核心语言特性。