原创

JDK 17 好用的文本块(Text Blocks)、switch 表达式、密封类(Sealed Classes)

一、文本块(Text Blocks)

在 JDK 17 之前(准确说 JDK 15 预览、17 正式转正),如果你想在代码里写一段多行的字符串(比如 SQL、JSON),得手动加换行符\n、转义双引号\",代码又乱又容易错。

比如以前写一段 SQL 是这样的:

// JDK 17之前的写法,又乱又容易写错
String sql = "SELECT id, name, age FROM user \n" +
             "WHERE age > 18 \n" +
             "AND status = \"active\" \n" +
             "ORDER BY create_time DESC";


用了文本块之后,直接用"""包裹多行字符串,不用转义、不用拼换行,代码一眼就能看明白:

// JDK 17文本块写法,简洁又清晰
String sql = """
    SELECT id, name, age FROM user
    WHERE age > 18
    AND status = "active"
    ORDER BY create_time DESC
    """;

二、switch 表达式

以前 switch 只能当语句用,必须写 break,容易漏;现在可以当表达式用,直接返回值,代码更简洁:

// 旧写法
String day;
switch (week) {
    case 1: day = "周一"; break;
    case 2: day = "周二"; break;
    default: day = "未知";
}

// JDK 17新写法
String day = switch (week) {
    case 1 -> "周一";
    case 2 -> "周二";
    default -> "未知";
};

三、密封类(Sealed Classes)

适合做架构设计时用,能精准控制哪些类可以继承 / 实现某个类 / 接口,避免无限制扩展导致的混乱。比如定义一个只能被 A、B 类继承的父类:

// 密封类:只有UserServiceImpl和AdminServiceImpl能实现这个接口
public sealed interface UserService 
    permits UserServiceImpl, AdminServiceImpl {}

// 允许实现
public final class UserServiceImpl implements UserService {}
// 允许实现
public final class AdminServiceImpl implements UserService {}
// 报错:没在permits里声明,不能实现
// public class GuestServiceImpl implements UserService {}


正文到此结束
本文目录