如果你这里不写 default,并且,少了一种类型的话,例如:
那么就会报编译错误,这就是 switch 模式匹配的穷举性检查
在第二次预览中,主要修复了针对包含参数泛型的封闭类的穷举性检查,即有如下封闭类:
对于下面的代码,穷举性检查就不会误报编译错误了:
这个特性还在不断改善,大家可以试一下,并可以向这里提意见交流:https://mail.openjdk.java.net/pipermail/amber-spec-experts/2022-February/003240.html
孵化中的新特性
外部函数与内存 API(第二次孵化)
相关 JEP:
这个是 Project Panama(取名自巴拿马运河)带来的一个很重要的孵化中的特性,就像连接太平洋和大西洋的巴拿马运河一样,Project Panama 希望将 Java 虚拟机与外部的非 Java 库连接起来。这个特性就是其中最重要的一部分
这个特性主要目的是:
- 首先,提供具有类似性能和安全特性 ByteBuffer API 的替代方案,修补了原有 API 的一些缺点(很多需要访问堆外内存的库,例如 Netty 操作直接内存作为缓存池这种,都会从中受益)
- 其次,通过用更多面向 Java 的 API 来代替 JNI,使本机库更易访问,也就是你可以通过 Java 代码直接调用系统库
- 最后,统一替换掉
sun.misc.Unsafe
里面关于内存访问的 API,换成了更易于使用的封装。
这里有一个例子,是关于使用 Foreign Linker API 实现使用 Java 直接调用 Windows 上面的 user32 库里面的 MessageBoxW
函数:
感兴趣可以看一下这个视频:Foreign Linker API: Java native access without C | Modern Java | JDK16 |Head Crashing Informatics 27
目前,一些有意思的正在使用外部函数与内存 API 实验的项目:
Vector API(第三次孵化)
相关 JEP:
这也是 Project Panama 中的一个重要组成部分。其中最主要的应用就是使用了 CPU 的 SIMD(单指令多数据)处理,它提供了通过程序的多通道数据流,可能有 4 条通道或 8 条通道或任意数量的单个数据元素流经的通道。并且 CPU 一次在所有通道上并行组织操作,这可以极大增加 CPU 吞吐量。通过 Vector API,Java 团队正在努力让 Java 程序员使用 Java 代码直接访问它;过去,他们必须在汇编代码级别对向量数学进行编程,或者使用 C/C++ 与 Intrinsic 一起使用,然后通过 JNI 提供给 Java。
一个主要的优化点就是循环,过去的循环(标量循环),一次在一个元素上执行,那很慢。现在,您可以使用 Vector API 将标量算法转换为速度更快的数据并行算法。一个使用 Vector 的例子:
注意使用处于孵化的 Java 特性需要加上额外的启动参数将模块暴露,这里是--add-modules jdk.incubator.vector
,需要在 javac 编译和 java 运行都加上这些参数,使用 IDEA 即:
测试结果:
其他使用,请参考:fizzbuzz-simd-style,这是一篇比较有意思的文章(虽然这个性能优化感觉不只由于 SIMD,还有算法优化的功劳,哈哈)
关于一些更加详细的使用,以及设计思路,可以参考这个音频:Vector API: SIMD Programming in Java