Java 17 新特性:密封类、模式匹配与 Switch 表达式

Java 17 新特性:密封类、模式匹配与 Switch 表达式

Java 17 作为长期支持(LTS)版本,引入了多项重要特性,显著提升了代码的安全性、简洁性和表达力。以下是三个核心特性的详细解析:


1. 密封类(Sealed Classes)

目的:限制类的继承关系,明确指定哪些类可以继承或实现目标类/接口。
关键字

  • sealed:声明密封类
  • permits:指定允许的子类
  • final/non-sealed:子类修饰符(必须显式声明)

示例

// 定义密封类 Shape,仅允许 Circle 和 Rectangle 继承
public sealed class Shape permits Circle, Rectangle { }

// 子类必须声明为 final、sealed 或 non-sealed
public final class Circle extends Shape { 
    private double radius;
}

public non-sealed class Rectangle extends Shape { 
    private double width, height;
}

优势

  • 增强封装性:避免未知子类破坏设计逻辑
  • 简化模式匹配:与 switch 结合时,编译器可验证完整性

2. 模式匹配(Pattern Matching)
2.1 instanceof 模式匹配

语法:直接提取匹配对象的变量,避免冗余转型。

Object obj = "Hello";
if (obj instanceof String s) {  // 匹配成功时自动转为 String 类型
    System.out.println(s.length()); // 直接使用变量 s
}

2.2 switch 模式匹配(预览特性)

语法:在 switch 中直接匹配类型并提取变量。

Object obj = 42;
String result = switch (obj) {
    case Integer i -> "整数: " + i;  // 匹配 Integer 类型
    case String s  -> "字符串: " + s;
    default        -> "未知类型";
};

优势

  • 代码简洁:减少类型检查和强制转换
  • 安全性:编译器检查模式覆盖完整性

3. Switch 表达式(Switch Expressions)

语法

  • 使用 -> 替代 :,无需 break
  • 可直接返回值
  • 支持多值匹配和代码块

示例

// 传统 switch 语句
switch (day) {
    case MONDAY:
    case FRIDAY:
        System.out.println("工作日");
        break;
    case SATURDAY:
        System.out.println("休息日");
        break;
}

// Switch 表达式(Java 17)
String type = switch (day) {
    case MONDAY, FRIDAY -> "工作日";  // 多值匹配
    case SATURDAY       -> {
        System.out.println("周末");   // 代码块
        yield "休息日";               // 使用 yield 返回值
    }
    default             -> "其他";
};

优势

  • 无穿透风险:每个分支独立执行
  • 表达力强:可直接赋值或返回结果
  • 模式集成:结合类型匹配更强大

特性关联与实战价值

  1. 密封类 + 模式匹配
    Shape shape = new Circle(5.0);
    double area = switch (shape) {
        case Circle c    -> $c.getRadius()^2 * \pi$; // 计算圆面积
        case Rectangle r -> $r.getWidth() * r.getHeight()$;
        // 无需 default:编译器知道所有子类已覆盖
    };
    

  2. 工程价值
    • 减少 Bug:编译时检查类型和分支完整性
    • 提升可读性:代码更贴近业务逻辑
    • 促进函数式风格:表达式化编程替代命令式

注意:模式匹配在 switch 中为预览特性(Java 17),需通过 --enable-preview 启用;Java 21 中正式标准化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值