JEP 441:使用switch的模式匹配改造Java

JEP 441: Pattern Matching for switch 已从 Targeted 状态提升为 Completed 状态,并将在 JDK 21 中正式发布

JEP 441 是 Java 语言的一个重要增强,它为 switch 表达式和语句引入了模式匹配功能。该功能在 JDK 17 首次作为预览功能引入,并在 JDK 18、JDK 19 和 JDK 20 中经过多次预览和反馈优化,最终在 JDK 21 中完成并正式发布。

主要特性

  1. 模式匹配的 switch

    • 传统的 switch 语句和表达式仅支持常量匹配,而新模式匹配允许在 case 标签中使用模式。
    • 该功能增强了代码的安全性,要求 switch 语句覆盖所有可能的输入值。
    • 与传统的 switch 不同,新模式匹配放宽了对 null 的限制,允许在 switch 中直接处理 null 值。
  2. null 处理的改进

    • 新模式匹配引入了 null 作为 case 标签,减少了处理 null 选择器表达式时的样板代码和潜在错误。
  3. when 子句

    • when 子句允许在 case 标签中添加额外的条件(守卫),只有当模式匹配且条件为真时,case 标签才会生效。
  4. 枚举类型的扩展支持

    • 新模式匹配支持在 case 标签中使用枚举常量的限定名称,同时保持了与现有 Java 代码的兼容性。

代码示例

模式匹配的 switch

static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> obj.toString();
    };
}

null 处理

static void testFooBarNew(String s) {
    switch (s) {
        case null         -> System.out.println("Oops");
        case "Foo", "Bar" -> System.out.println("Great");
        default           -> System.out.println("Ok");
    };
}

when 子句

static void testStringOld(String response) {
    switch (response) {
        case null -> { }
        case String s when s.equalsIgnoreCase("YES") -> System.out.println("You got it");
        case String s when s.equalsIgnoreCase("NO") -> System.out.println("Shame");
        case String s -> System.out.println("Sorry?");
    }
}

未来展望

OpenJDK 团队计划进一步扩展模式匹配的功能,包括:

  • 引入 AND 和 OR 模式,以增强 case 标签的表达能力。
  • 支持 守护模式,允许在 switch 语句中使用更复杂的条件逻辑。
  • 允许普通类声明 解构模式,指定如何将对象与模式匹配。

开发者资源

  • 开发者可以通过 InfoQ 文章 深入了解 Java 模式匹配的详细指南。
  • 开发者可以从 JDK 21 Early-Access Builds 下载 OpenJDK 进行实验。
  • 也可以使用 SDKMan 管理不同版本的 Java,简化下载和安装过程。

注意事项

这些早期访问版本可能不如最终版本稳定,主要用于测试和反馈。JDK 21 的正式版计划于 2023 年 9 月发布。

阅读 94
0 条评论