xDocxDoc
AI
前端
后端
iOS
Android
Flutter
AI
前端
后端
iOS
Android
Flutter
  • JDK17 核心语法糖

JDK17 核心语法糖

🍬 一、记录类(Record)

作用:替代传统 POJO,自动生成不可变数据类的构造器、访问器、equals()、hashCode()、toString()。
语法差异:

// JDK 17
public record User(String name, int age) {}

// 等效于 JDK 8 的 50+ 行代码(字段、构造器、getter、equals 等)

特性:

  • 隐含 final 修饰,字段不可变
  • 访问方法为 name() 而非 getName()
  • 支持构造器参数校验和自定义方法

🔐 二、密封类(Sealed Classes)

作用:精确控制类的继承关系,避免滥用扩展。
语法差异:

// JDK 17
public sealed class Shape permits Circle, Rectangle {}
public final class Circle extends Shape {} // 子类必须为 final/sealed/non-sealed

// JDK 8:类可被任意继承,无限制

特性:

  • permits 指定允许继承的子类
  • 编译器强制检查穷尽性(如结合 switch 模式匹配)

🔍 三、模式匹配(Pattern Matching)

1. instanceof 模式匹配

作用:合并类型检查和转换,减少冗余代码。

// JDK 17
if (obj instanceof String s && s.length() > 5) {
    System.out.println(s); // 直接使用 s
}

// JDK 8:需显式转换
if (obj instanceof String) {
    String s = (String) obj;
    // ...
}

2. switch 模式匹配

作用:支持类型匹配和返回值,替代复杂 if-else。

// JDK 17
String result = switch (obj) {
    case Integer i -> "整数: " + i;
    case String s -> "字符串: " + s;
    default -> "未知";
};

优势:支持守卫条件(where)和 null 处理


📜 四、文本块(Text Blocks)

作用:简化多行字符串(如 JSON、SQL、HTML)。
语法差异:

// JDK 17
String sql = """
    SELECT * FROM users
    WHERE status = 'ACTIVE'
    ORDER BY name""";

// JDK 8:需手动拼接和转义
String sql = "SELECT * FROM users\n"
           + "WHERE status = 'ACTIVE'\n"
           + "ORDER BY name";

特性:自动处理缩进,支持行连接符 \


⚡ 五、增强的 switch 表达式

作用:将 switch 从语句升级为表达式,支持直接返回值和箭头语法。
语法差异:

// JDK 17
String day = switch (dayCode) {
    case 1 -> "周一";
    case 2 -> "周二";
    case 3, 4, 5 -> "工作日"; // 多值匹配
    default -> "周末";
};

// JDK 8:冗长且需 break
switch (dayCode) {
    case 1: return "周一";
    case 2: return "周二";
    // ...
}

扩展:支持 yield 返回值(多行逻辑)


🧩 六、接口的私有方法

作用:在接口中封装重复逻辑,供默认方法调用。

// JDK 9+ 支持,JDK 17 完善
public interface Logger {
    default void logInfo(String msg) { log(msg, "INFO"); }
    private void log(String msg, String level) {
        System.out.println("[" + level + "] " + msg);
    }
}

差异:JDK 8 的接口仅支持默认方法和静态方法


🔄 七、Stream API 增强

新增方法:

  • Stream.toList():替代 collect(Collectors.toList())
  • Stream.mapMulti():替代 flatMap 的复杂场景
// JDK 16+
List<String> names = people.stream()
                           .map(Person::name)
                           .toList(); // 一行替代旧版收集器

⚖️ 八、与 JDK 8 的核心差异总结

特性JDK 8JDK 17
数据类冗长 POJO(手动模板代码)record(一行定义)
继承控制完全开放或 final密封类(sealed + permits)
类型匹配instanceof + 显式强转模式匹配(直接绑定变量)
多行字符串拼接 + 转义文本块(""")
switch语句(无返回值,需 break)表达式(返回值、箭头语法、模式匹配)
垃圾回收Parallel GC / G1 GCZGC(亚毫秒停顿)、Shenandoah
空指针异常无上下文信息详细提示 NullPointerException 原因

💎 总结

JDK 17 通过记录类、密封类、模式匹配等语法糖,显著提升了代码简洁性和安全性,尤其在以下场景:

  1. 数据建模:record 替代传统 POJO,减少 90% 样板代码。
  2. 领域驱动:密封类精准控制继承关系,避免滥用扩展。
  3. 分支处理:switch 表达式 + 模式匹配替代复杂 if-else,支持穷尽性检查。
  4. 模板文本:文本块优化 SQL/JSON/HTML 的编写体验。

迁移建议:

  • 新项目直接采用 JDK 17(LTS 支持至 2029 年)。
  • 旧项目逐步替换弃用 API(如 Date 改用 java.time),并测试模块化兼容性。

这些特性不仅减少代码量 30%~50%,还通过编译器强制检查(如密封类继承、模式匹配穷尽性)提升健壮性,标志着 Java 向现代化语言的转型。

最后更新: 2025/8/26 22:47