Java14中的好用特性分享(2)
继续上一篇的《Java14中的好用特性分享》,上一篇分享了Java14中的两个标准特性,这里讲一下三个主要的预览特性:
- instanceof的模式匹配
- record 类型
- 文本块
IDEA开启预览
有预览特性的JDK需要明确开启预览,命令是–enable-preview,在IDEA中是选择语言级别:

选择第一个就不提供预览特性,选择带有Preview的级别才行。
文本块
先说这个吧,这个看起来最简单。
在很多其他语言中都提供了文本块的特性,Java却迟迟不给,还时时难产,让我们郁闷。大段大段的拼接和转义实在逼得我们有去转向c#的倾向。
Java的文本块提案历经多个JEP。最早的是Java12中计划酝酿的JEP 326:Raw String Literals(原始字符串字面量,见https://openjdk.java.net/jeps/326)。这个提案被撤销合并到了提案JEP 355中:Text Blocks(文本块),同时也延迟到了Java13中(因为社区反馈不好,见http://mail.openjdk.java.net/pipermail/jdk-dev/2018-December/002402.html)。后来又分别提出了JEP 368(也就是Java14提供的这个预览版)和JEP 378(今年会在Java15中做为标准特性发布)。
文本块以三个双引号做为开始和结尾(俗称“胖分隔”),更标准的说法是文本块的结尾是以三个双引号,单开头是三个双引号加换行符 —— 也就是说空字符块也得换行,直接写6个双引号是不行的
String b = """
3
4""";
上面的b输出来是
3
4
就这么简单吗?基本上是的。不过你可能注意到上面的3和4前面明明都有大段空白,为啥写出来就没了呢?这还不是为了我们嘛!如果有空白就打出来,那为了去掉空白我们只能把字符串都贴左边写多难看啊。所以编译器会从第一行字符开始数,一直到结束符,哪一行空白符最少就把所有行都减去那么多空白。所以下面的变量输出是
String b = """
3
4
5""";
3
4
5
强悍的转义能力
块内包含胖分隔符
这个简单,只要在分隔符前加反斜杠即可:
String b = """
\"""
4
5""";
去掉换行
有些块内的换行不是期望的,只是为了看着方便,可以在末尾加反斜杠:
String b = """
1\
1\
1\
""";
这个结果是111。
记住:文本块是语法糖
instanceof模式匹配
这个功能也比较简单。以前使用instanceof的时候是这样的
Object a = "null";
if (a instanceof String) {
String s = (String) a;
System.out.println(s);
}
每次结束必须强制转换,是在太丑了。模式匹配提供自动转换赋值的能力:
Object a = "null";
if (a instanceof String s) {
System.out.println(s);
}
这个也是语法糖,你可以反编译后看一下。
record
以前Java文件内的类型有四种:class/interface/@interface/enum,现在增加了一种record。
编译器已经将其翻译成“记录”了
record也是语法糖,它有点类似于lombok的@Data注解。它的出现背景也和@Data类似,就是为了定义数据类。
关于这个类型这里不说了,有兴趣的可以自己先去了解一下。不过我猜测这个类型转正的时候特性变动会比较大。
