本专栏的目的是收集全网最优秀的文章,供Java程序员成长,若有侵权,请联系我们删除。
最近,逛dzone的时候,看到一位老外写了一篇文章,说 Mark Reinhold 为JDK14提交了5个JEP建议(不一定会出现在JDK14中)。编号分别是 305, 343, 359, 366, 368。
接下来,我就带着你来盘他,达到面试吹牛逼的目的。
为什么这么说呢?因为无论大小厂都希望高p候选人对技术永远保持着前瞻性和好奇感,然而,你进去后,才发现接手的大多数项目还在JDK8,甚至有的项目还在JDK7(刚好14的一半^_^)。如果你身边都是一群积极上进的小伙伴,说不定在你的带动下,还真能推动,要是身边都是一群老油条,你还没推动起来,你却因不合群而被他们踢出局了。
我们先来聊聊这位大佬Mark Reinhold是谁?
他是JDK 1.2和5.0版本的首席工程师,Java SE 6的规范制定的负责人,还是JDK 7,JDK 8和JDK 9 项目和规范的负责人,目前,他主要在OpenJDK社区领导JDK项目,归根结底,两个字:牛逼。
好了,我们回归到正文,来拆解一下这5个JEP。
首先,建议读一读之前的一篇文章,JDK的发展史:它,是一部全网最全的JDK发展历史轨迹图...
说明一下JDK14目前还在开发中,估计正式发布还需要等好几个月,来看一下Mark Reinhold邮件里的发布计划(具体发布时间见红框):
5个针对性的JEP建议分别是:
1、JEP305:instanceof的模式匹配;
2、JEP343:打包工具;
3、JEP359:record关键字;
4、JEP366:弃用Parallel Scavenge+Serial Old垃圾收集算法的组合;
5、JEP368:文本块。
# JEP305:instanceof的模式匹配
这个功能是对instanceof关键字加强,通过模式匹配来简化逻辑,使得操作更简单,比如下面两种写法。
我们熟悉的写法:
if (obj instanceof String) {
String s = (String) obj;
// use s
}
新的写法:
突出了绑定变量的范围是由包含的表达式和语句的语义确定,下面这种写法,如果obj是String类型,那么s可以在true代码块中使用,但在else代码块中不能使用s变量。
if (obj instanceof String s) {
// 这里可以使用s变量
} else {
// 这里不可以使用s变量
}
又比如下面这种写法:
if (!(obj instanceof String s)) {
.. s.contains(..) ..
} else {
.. s.contains(..) ..
}
上面这种写法,true代码块中s引用的是obj;false代码块中s引用的是绑定变量。
同样,它还能与&& ||操作符一起使用,比如:
if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}
if (obj instanceof String s || s.length() > 5) {.. s.contains(..) ..}
说白了,就一个目的:简化逻辑,丰富instanceof的语义。
# JEP343:打包工具
这个没有什么说的,说白了就是提供一种跨平台的打包工具,支持的平台分别是:
Linux: deb and rpm
macOS: pkg and dmg
Windows: msi and exe
# JEP359:record关键字
这个record关键字的语义,是简化bean,省略掉繁琐的构造函数、equals()、hashCode()、toString()等,如下面这种格式:
record Point(int x, int y) { }
跟Lombok有点类似,之前有篇文章介绍过(参考:工具:IDEA必备的利器Lombok,减少代码冗余神器。),这个Lombok工具实际上只是给了你一种没有写这些函数的假象,背后它默默帮你做了,它是怎么做的呢?它会在编译期动手脚,将相应的功能注入到jar包。这个record关键字到底会怎么做,就不得而知了。
# JEP366:弃用Parallel Scavenge+Serial Old垃圾收集算法的组合
通过邮件得出的大概意思,就是这个GC算法的组合很少使用,但需要大量维护工作,因此弃用。
# JEP368:文本块
这个特性对应JDK13中JEP 355: Text Blocks (Preview)的补充(参考:用这种方式学习JDK 13新特性,真easy...),但我不论怎么看,都觉得跟Python有点像,我挺期待这个功能,之前字符串处理方法的,转义太烦了,可读性太差了!!!
简单举例说明一下,老写法:
String html = "\n" +
"
\n" +"
Hello, world
\n" +" \n" +
"\n";
新写法如下:
String html = """
Hello, world
""" ;
# 总结
JDK14到底有那些新功能呢?
可以确定的JEP如下:JEP 345: NUMA-Aware Memory Allocation for G1
JEP 349: JFR Event Streaming
JEP 352: Non-Volatile Mapped Byte Buffers
JEP 358: Helpful NullPointerExceptions
JEP 361: Switch Expressions (Standard)
JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
JEP 364: ZGC on macOS
JEP 367: Remove the Pack200 Tools and API
待确认的5个JEP建议:JEP 305: Pattern Matching for instanceof (Preview)
JEP 343: Packaging Tool (Incubator)
JEP 359: Records
JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination
JEP 368: Text Blocks (Second Preview)
最后,你可以获取JDK14的尝鲜版本。
你要用正式版,唯一能做的就是默默等待...
兄弟,我敢打赌你们还有部分项目还在JDK7,要是JDK14出来了,它们之间可是差了一倍哦!
逃逃逃~~~