JDK 12、13 都是非 LTS 版本(半年寿命),但它们孵化的两个特性——**文本块(Text Blocks)**和switch 表达式——实在太香,以至于后面转正时几乎人人都在用。这一篇提前把它们讲透,免得你看到别人代码里的"""和->一脸懵。
一、文本块:多行字符串终于体面了
在 JDK 12 之前,写一段 JSON、SQL、HTML,要么拼+号拼到崩溃,要么疯狂\n转义:
// JDK 11 及以前Stringjson="{\n"+" \"name\": \"Tom\",\n"+" \"age\": 18\n"+"}";JDK 13 引入文本块(12 是预览,15 转正),用"""包起来,所见即所得:
Stringjson=""" { "name": "Tom", "age": 18 } """;三个关键点
- 自动处理换行与引号:里面直接写
"不用转义,\n也不用写,文本块天然多行。 - 缩进怎么算:结束的
"""所在的列,决定了"公共缩进基准"。上面例子中正文实际内容是去掉了与结束符对齐的那部分前导空格的,但行内相对缩进保留。若想完全控制缩进,用stripIndent()再处理。 - 占位符:文本块配合
String.format或formatted方法拼变量:
Stringname="Tom";intage=18;Strings=""" name=%s, age=%d """.formatted(name,age);文本块对写 SQL、测试 JSON、模板字符串、日志样例帮助巨大,是"可读性即生产力"的典型。
二、switch 表达式:从"语句"变"表达式"
传统switch是个语句(statement),只能执行代码,不能返回;JDK 12 预览、14 转正的switch 表达式(expression)让它能返回值,并引入->箭头语法和"不穿透"语义。
老写法 vs 新写法
// 老:语句,要 break,易漏intdays;switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;break;case4:case6:case9:case11:days=30;break;default:days=28;}// 新:表达式,直接返回,不穿透intdays=switch(month){case1,3,5,7,8,10,12->31;// 多标签用逗号case4,6,9,11->30;default->28;// -> 不会落到下一个分支};必须知道的规则
->分支不会穿透(fall-through),不用写break,天然避免遗漏 bug。- 表达式要求覆盖所有情况:要么有
default,要么枚举穷尽,否则编译器报错。这比老 switch 安全得多。 - 需要多行逻辑时,用
yield返回值(替代return在 switch 表达式里的作用):
intresult=switch(x){case1->{inttmp=heavyCompute(x);yieldtmp*2;// 多语句块用 yield 返回}default->0;};与模式匹配的伏笔
switch 表达式还埋了一个重要伏笔:为后续的模式匹配(pattern matching)铺路。JDK 17+ 的switch可以匹配类型,这套->语法是统一的基础。
三、其他小特性
| 版本 | 特性 | 说明 |
|---|---|---|
| 12 | String新增indent()、transform() | 链式加工字符串 |
| 12 | G1 支持 NUMA 感知 | 多路服务器上内存本地化,吞吐提升 |
| 12 | 微基准测试套件(JMH)转正 | 性能对比更规范 |
| 13 | Socket/ServerSocket重写 | 改用底层 NIO 实现,为虚拟线程埋伏笔 |
| 13 | 动态 CDS 归档 | 启动更快,类数据共享更易用 |
| 12/13 | switch表达式预览 | 见上文,14 转正 |
四、为什么这些"预览"特性值得提前学
非 LTS 版本的预览特性,往往半年后就转正(或小幅调整)。文本块、switch 表达式都是这种"提前一版露脸、下一版稳定"的路径。提前熟悉,等转正时不慌;而且这些特性不依赖 LTS,只要 JDK 版本够(或开了预览开关),你现在的项目就能用——前提是团队 JDK 版本允许。
预览特性需编译/运行时加
--enable-preview(JDK 12/13 阶段)。转正后(文本块 15、switch 14)就不用了。
五、本篇记住的清单
- 文本块
"""..."""天然多行、引号不转义,配合.formatted()拼变量。 - 文本块缩进以结束
"""为基准,复杂场景用stripIndent()。 - switch 表达式能返回值,用
->且不穿透,多语句用yield。 - switch 表达式要求情况全覆盖(default 或枚举穷尽),更安全。
- 这两个特性在 12/13 是预览,14/15 转正,转正后免
--enable-preview。 - 13 重写了
Socket底层,为虚拟线程铺路;12 的 G1 NUMA 提升多路机吞吐。