Java 14 开箱,它真香香香香
![](http://static.careerengine.us/api/aov2/http%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1U6PQ1HhPSunnDyQv32PibDjA9lXLmiaHiaBibzWR6C8RgaqrSWfgibeKqJkA_%7C_0%3Fwx_fmt%3Djpeg.jpg)
Java 14 已经发布有一周时间了,我准备来开个箱,和小伙伴们一起来看看新特性里面都有哪些好玩的。我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。先来看看 Java 14 都有哪些新特性吧!
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1UtcmxsmTibjvJicdVEBVo6LHM45xiahkuBUs8cmtLyoXLt2tpClVZnuT4A_%7C_640%3Fwx_fmt%3Dpng.jpg)
红色线划出来的是我比较感兴趣的,其余的对我没什么太大的吸引力,就暂且略过。
01、下载 JDK 14
要想开箱,得先下载 JDK 14,不然拿什么开箱呢,对吧?有 2 处地方可供下载,Oracle 上可以下载商用版, jdk.java.net 上可以下载开源版。我们就选择后者吧。
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1UBlAichrVnuRQAd7rG3SzjiabSnYvPfeUEBN8XAibbYeCNkWQzLjrcd8ZQ_%7C_640%3Fwx_fmt%3Dpng.jpg)
我目前用的是 Windows 操作系统,所以就选择 Windows 版的 zip 包进行下载,完成后记得解压。
02、升级 IntelliJ IDEA
需要把 IDEA 升级到抢先体验版 2020.1 EAP,否则无法支持 Java 14 的新特性。
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1Uv89MwlTreKWM5WKLCt7PvWlGFXHCk1zMPJaenYztTrWnPfBHicp2vDQ_%7C_640%3Fwx_fmt%3Dpng.jpg)
社区版的下载地址如下所示:
https://www.jetbrains.com/idea/nextversion/
安装的时候可以把之前的版本卸载,也可以选择保留。完成后,我们来新建一个 Java 14 的项目。
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1UtDZk72xTPXAiamdOdfkmqv6r1gGn6BMOm3ibsKGcN4mttgAmVwViaQGhQ_%7C_640%3Fwx_fmt%3Dpng.jpg)
01、instanceof
按照新特性的顺序,我们就先从 instanceof 说起吧。旧式的 instanceof 的用法如下所示:
publicclassOldInstanceOf{
publicstaticvoidmain(String[] args){
Object str = "Java 14,真香";
if (str instanceof String) {
String s = (String)str;
System.out.println(s.length());
}
}
}
需要先使用 instanceof 在 if 条件中判断 str 的类型是否为 String(第一步),再在 if 语句中将 str 强转为字符串类型(第二步),并且要重新声明一个变量用于强转后的赋值(第三步)。
三个步骤也不算多,但总觉得应该还有更好的语法,这不,Java 14 就想到了这一层。
publicclassNewInstanceOf{
publicstaticvoidmain(String[] args){
Object str = "Java 14,真香";
if (str instanceof String s) {
System.out.println(s.length());
}
}
}
可以直接在 if 条件判断类型的时候添加一个变量,就不需要再强转和声明新的变量了。是不是特别简洁?但模式匹配的 instanceof 在 Java 14 中是预览版的,默认是不启用的,所以这段代码会有一个奇怪的编译错误(Java 14 中不支持模式匹配的 instanceof)。
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1ULic4QKm76cx9pCPCJLNgOyktGWxlQbJ08DaUDheRTlicJLX3yWB1bjvA_%7C_640%3Fwx_fmt%3Dpng.jpg)
那怎么解决这个问题呢?需要在项目配置中手动设置一下语言的版本。
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1UMHNyWaVJc7K4B2gryQJJ9VX21LgiaGytVlGiar4epcibxoyga6BKsHy5w_%7C_640%3Fwx_fmt%3Dpng.jpg)
设置完成后,编译错误就随风飘走了。程序输出的结果如下所示:
10
不错不错,真香。想知道 Java 编译器在背后帮我们做了什么吗?看一下反编译后的字节码就明白了。
publicclassNewInstanceOf{
publicNewInstanceOf(){
}
publicstaticvoidmain(String[] args){
Object str = "Java 14,真香";
String s;
if (str instanceof String && (s = (String)str) == (String)str) {
System.out.println(s.length());
}
}
}
在 if 条件判断前,先声明了变量 s,然后在 if 条件中进行了强转
s = (String)str)
,并且判断了 s 和 str 是否相等。确实是一个解放开放者生产力的好特性,强烈希望这个特性在下个版本中转正。02、Records
在之前的一篇文章中,我谈到了类的不可变性,它是这样定义的:
publicfinalclassWriter{
privatefinal String name;
privatefinalint age;
publicWriter(String name, int age){
this.name = name;
this.age = age;
}
publicintgetAge(){
return age;
}
public String getName(){
return name;
}
}
那么,对于 Records 来说,一条 Record 就代表一个不变的状态。尽管它会提供诸如
equals()
、hashCode()
、toString()
、构造方法,以及字段的 getter,但它无意替代可变对象的类(没有 setter),以及 Lombok 提供的功能。来用 Records 替代一下上面这个 Writer 类:
public record Writer(String name, int age){ }
你看,一行代码就搞定。关键是比之前的代码功能更丰富,来看一下反编译后的字节码:
publicfinalclassWriterextendsjava.lang.Record{
privatefinal java.lang.String name;
privatefinalint age;
publicWriter(java.lang.String name, int age){ /* compiled code */ }
public java.lang.String toString(){ /* compiled code */ }
publicfinalinthashCode(){ /* compiled code */ }
publicfinalbooleanequals(java.lang.Object o){ /* compiled code */ }
public java.lang.String name(){ /* compiled code */ }
publicintage(){ /* compiled code */ }
}
类是 final 的,字段是 private final 的,构造方法有两个参数,
toString()
、hashCode()
、equals()
方法也有了,getter 方法也有了,只不过没有 get 前缀。但是没有 setter 方法,也就是说 Records 确实针对的是不可变对象——鉴定完毕。那怎么使用 Records 呢?publicclassWriterDemo{
publicstaticvoidmain(String[] args){
Writer writer = new Writer("沉默王二",18);
System.out.println("toString:" + writer);
System.out.println("hashCode:" + writer.hashCode());
System.out.println("name:" + writer.name());
System.out.println("age:" + writer.age());
Writer writer1 = new Writer("沉默王二", 18);
System.out.println("equals:" + (writer.equals(writer1)));
}
}
程序输出的结果如下所示:
toString:Writer[name=沉默王二, age=18]
hashCode:1130697218
name:沉默王二
age:18
equals:true
不错不错,真香,以后定义不可变类时就简单了,强烈希望这个特性在下个版本中转正。
03、switch 表达式
关于 switch 表达式,我在之前的一篇文章中已经详细说明了,点击传送门可以跳转过去看看。两周时间过去了,switch 表达式终于“媳妇熬成婆”,转正了,恭喜恭喜。
记得这篇文章发表到掘金的时候,被喷子各种无脑 diss,说:“还以为你有什么技巧,没想到用的是 Java 13,可我们还停留在 Java 8 啊!”这显然是一种固步自封的心态,非常不可取,程序员不应该这样。一个最简单的道理就是,Java 6 当年也很经典,不是被 Java 8 取代了吗?随着时间的推移,Java 8 早晚会被更划时代的新版本取代——总要进步嘛。
关于 switch 表达式,这里就简单地搬个例子给你瞧瞧:
publicclassSwitchDemo{
enum PlayerTypes {
TENNIS,
FOOTBALL,
BASKETBALL,
PINGPANG,
UNKNOWN
}
publicstaticvoidmain(String[] args){
System.out.println(createPlayer(PlayerTypes.BASKETBALL));
}
privatestatic String createPlayer(PlayerTypes playerType){
returnswitch (playerType) {
case TENNIS -> "网球运动员费德勒";
case FOOTBALL -> "足球运动员C罗";
case BASKETBALL -> "篮球运动员詹姆斯";
case PINGPANG -> "乒乓球运动员马龙";
case UNKNOWN -> thrownew IllegalArgumentException("未知");
};
}
}
除了可以使用
->
的新式语法,还可以作为 return 结果,真香。04、Text Blocks
在文本块(Text Blocks)出现之前,如果我们需要拼接多行的字符串,就需要很多英文双引号和加号,看起来就好像老太婆的裹脚布,非常不雅。如果恰好要拼接一些 HTML 格式的文本(原生 SQL 也是如此)的话,还要通过空格进行排版,通过换行转义符
\n
进行换行,这些繁琐的工作对于一名开发人员来说,简直就是灾难。publicclassOldTextBlock{
publicstaticvoidmain(String[] args){
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
System.out.println(html);
}
}
Java 14 就完全不同了:
publicclassNewTextBlock{
publicstaticvoidmain(String[] args){
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
System.out.println(html);
}
}
多余的英文双引号、加号、换行转义符,统统不见了。仅仅是通过前后三个英文双引号就实现了。我只能说,香,它真的香!
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_gif_%7C_z40lCFUAHpmqYoIohYybico7JJDgoHr1U8jpSpXv4ZzYtpJRbjbPPMuHUtyVoCJDaOvZ9AbFN8GN38n4SWjKKAQ_%7C_640%3Fwx_fmt%3Dgif.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_C1uDMDqjn1ibHbCU2uStzgickicPVx8dTvXsJx0bSBicMffyV0l2A9ZhFLJ6yNf4sydFpfCw8hVpsv9A3JNY0yYibfA_%7C_640%3F.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_C1uDMDqjn1ibHbCU2uStzgickicPVx8dTvXsJx0bSBicMffyV0l2A9ZhFLJ6yNf4sydFpfCw8hVpsv9A3JNY0yYibfA_%7C_640%3F.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn1ibHbCU2uStzgickicPVx8dTvXD3xBw8gjLD3G1dwCPXfbkpUrYaWHlzBDMGGpVvueiaaAYtAEEkcQicHw_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18LPQfZkBTzR42LiapBhhiaUxHBbrQnlkxzZqZGfgiaq4G7gHadvQibhVqGpeYMNcc9KkdVLibKia2XJHkg_%7C_640%3Fwx_fmt%3Djpeg.jpg)
好文章,我 在看
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn19wtuQpK3jmJW3bFGWI8Yz6FR17tl1MF8VfqYxPx990kv2J74Lvqwib26KayHdOXd6ebzrqYibbTjww_%7C_640%3Fwx_fmt%3Djpeg.jpg)
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。