Java SE 17 新增特性

作者:Grey

原文地址:Java SE 17 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: GitCode:java_new_features

Sealed Classes 正式启用

Sealed Classes 在 Java SE 15 和 Java SE 16 中都是预览功能, 在 Java SE 17 中成为正式功能。

示例代码:

package git.snippets.jdk17;

/**
* 密封类(Sealed Classes)
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 17
*/
public class SealedClassInJdk17 {
public static void main(String[] args) { }
} sealed interface Dog permits Collie, TuGou {
//...
} sealed class Collie implements Dog permits BorderCollie { } final class BorderCollie extends Collie {
} // 使用 non-sealed 关键字,表示可以被任意继承
non-sealed class TuGou implements Dog {
}

增强型伪随机数生成器

JEP 356为伪随机数生成器(PRNG)提供了新的接口和实现。

因此,更容易互换使用不同的算法,而且它还为基于流的编程提供了更好的支持,示例代码如下

package git.snippets.jdk17;

import java.util.random.RandomGeneratorFactory;
import java.util.stream.IntStream; /**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/8/21
* @since 17
*/
public class RandomNewDemo {
public IntStream getPseudoInts(String algorithm, int streamSize) {
// returns an IntStream with size @streamSize of random numbers generated using the @algorithm
// where the lower bound is 0 and the upper is 100 (exclusive)
return RandomGeneratorFactory.of(algorithm)
.create()
.ints(streamSize, 0, 100);
}
}

传统的随机类,如java.util.Random、SplittableRandomSecureRandom现在扩展了新的RandomGenerator接口。

恢复始终严格的浮点语义

这个 JEP 主要用于科学应用,它使浮点运算始终保持严格。默认的浮点运算是 strict 或 strictfp ,两者都能保证在每个平台上的浮点计算结果相同。

在 Java 1.2 之前,strictfp 行为也是默认的。然而,由于硬件问题,必须使用关键字 strictfp 来重新启用这种行为, 但是现在已经不需要使用这个关键字了。

详见: JEP 306

废弃 Applet API

由于许多网络浏览器已经取消了对 Java 插件的支持。所以 Java SE 17 将 Applet API 标记为删除。

强化封装 JDK 的内部结构

从 Java 9 引入模块化开始,JDK 对于其内部的 API 的访问限制就已经明确开始落地,只是当时我们可以通过配置启动参数 --illegal-access 来继续使用 JDK 的内部 API,其中 Java 9 ~ Java 15 这个参数默认 permit,Java 16 默认 deny。

JEP 403中删除了标志-illegal-access,平台将忽略该标志,如果该标志存在,控制台将发出消息告知该标志的终止。按照提案的说明,被严格限制的这些内部 API 包括:

java.*包下面的部分非public类、方法、属性,例如Classloader当中的defineClass等等。

sun.*下的所有类及其成员都是内部 API。

绝大多数com.sun.*jdk.*org.*包下面的类及其成员也是内部 API。

具体可参考:Java 17 更新(6):制裁!我自己私有的 API 你们怎么随便一个人都想用?

Switch类型匹配(预览功能)

这是通过加强 switch 表达式和语句的模式匹配能力,减少了定义这些表达式所需的模板,此外,switch 中增加了空值的支持。

示例代码

package git.snippets.jdk17;

/**
* switch类型匹配(预览功能)
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2021/11/29
* @since 17
*/
public class SwitchMatchTest {
public static void main(String[] args) { } record Human(String name, int age, String profession) {
} record Circle() implements Shape {
public int getNumberOfSides() {
return 0;
}
} interface Shape {
} record Triangle() implements Shape {
public int getNumberOfSides() {
return 0;
}
} public String checkObject(Object obj) {
return switch (obj) {
case Human h -> "Name: %s, age: %s and profession: %s".formatted(h.name(), h.age(), h.profession());
case Circle c -> "This is a circle";
case Shape s -> "It is just a shape";
case null -> "It is null";
default -> "It is an object";
};
} public String checkShape(Shape shape) {
return switch (shape) {
case Triangle t && (t.getNumberOfSides() != 3) -> "This is a weird triangle";
case Circle c && (c.getNumberOfSides() != 0) -> "This is a weird circle";
default -> "Just a normal shape";
};
}
}

移除 RMI Activation

详见:JEP 407: Remove RMI Activation

删除实验性 AOT 和 JIT 编译器

在 Java SE 9中,JEP 295 引入了超前编译(jaotc 工具),作为一个实验性功能。后来的 Java SE 10,JEP 317 又提出它是一个实验性的 JIT 编译器。

然而,这个功能自从它们被引入后就没有什么用处了,而且需要大量的精力来维护它,所以这个 JEP 删除了基于 Java 的实验性超前(AOT)和及时(JIT)编译器

以下 AOT 包、类、工具和代码被删除。

jdk.aot — the jaotc tool

jdk.internal.vm.compiler — the Graal compiler

jdk.internal.vm.compiler.management — Graal’s MBean

src/hotspot/share/aot — dumps and loads AOT code

以及由#if INCLUDE_AOT保护的额外代码

详见:JEP 410: Remove the Experimental AOT and JIT Compiler

Foreign Function & Memory API(孵化功能)

这个外来函数和内存API允许开发者访问 JVM 之外的代码(Foreign Function)、存储在 JVM 之外的数据(堆外数据),以及访问不由 JVM 管理的内存(foreign memory)。

P.S 这是一个孵化功能;需要添加--add-modules jdk.incubator.foreign来编译和运行 Java 代码。

一个示例:

Foreign Linker API examples in Java 16

详见:JEP 412: Foreign Function & Memory API (Incubator)

更多

Java SE 7及以后各版本新增特性

参考资料

JDK 17 Release Notes

Java17新特性

New Features in Java 17

What is new in Java 17

Java SE 17 新增特性的更多相关文章

  1. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  2. Java SE 9 新增特性

    Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  3. Java SE 10 新增特性

    Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  4. Java SE 15 新增特性

    Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  5. Java SE 18 新增特性

    Java SE 18 新增特性 作者:Grey 原文地址:Java SE 18 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  6. Java SE 19 新增特性

    Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...

  7. Java SE 11 新增特性

    Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  8. Java SE 12 新增特性

    Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  9. Java SE 13 新增特性

    Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

随机推荐

  1. 【原创】eNSP路由器启动#号问题排查

    1.删除拖出来的设备,重新拖出来一台---我用过[有时候好使] 2.确保Ensp的设置-工具-Virtual Box安装目录是否正确--我也遇到过[尤其是卸载掉Virtual Box重装之后] 3.确 ...

  2. STM32内存知识

    在了解STM32内存之前需要了解 MCU 的型号和MDK 中的.map 文件,很多刚学习 stm32 时都不会过多的去了解 MCU 的选型,是在太枯燥了.这里在从新了解一下,久了就熟悉了. 一.STM ...

  3. ExtJS 布局-HBox 布局(HBox layout)

    更新记录: 2022年6月11日 更新文章结构. 2022年6月8日 发布. 2022年6月1日 开始. 1.说明 hbox布局与column布局几乎相同,但hbox允许拉伸列的高度. 既可以在水平方 ...

  4. vue大型电商项目尚品汇(后台篇)day03

    今天把平台属性的管理基本完成了,后台管理做到现在基本也开始熟悉,确实就是对ElementUI的一个熟练程度. 一.平台属性管理 1.动态展示数据 先把接口弄好,应该在第三级标题选择后进行发请求 静态页 ...

  5. NC204382 中序序列

    NC204382 中序序列 题目 题目描述 给定一棵有 \(n\) 个结点的二叉树的先序遍历与后序遍历序列,求其中序遍历序列. 若某节点只有一个子结点,则此处将其看作左儿子结点 示例1 输入 5,[3 ...

  6. Educational Codeforces Round 128 (Rated for Div. 2) A-C+E

    Educational Codeforces Round 128 (Rated for Div. 2) A-C+E A 题目 https://codeforces.com/contest/1680/p ...

  7. WPF双滑块控件以及强制捕获鼠标事件焦点

    效果 概述 最近有个小需求要用双滑块表示一个取值范围,于是就简单做了个用户控件,在此记录下. 使用矩形Rectangle表示范围,椭圆Ellipse表示滑块,使用Canvas控制滑块的左右移动. 椭圆 ...

  8. Tapdata PDK 生态共建计划启动!Doris、OceanBase、PolarDB、SequoiaDB 等十余家厂商首批加入

      2022年4月7日,Tapdata 正式启动 PDK 插件生态共建计划,致力于全面连接数据孤岛,加速构建更加开放的数据生态,以期让各行各业的使用者都能释放数据的价值,随时获取新鲜的数据.截至目前, ...

  9. String类型函数传递问题

    String类型函数传递问题 问题 以前没有注意过的一个问题, 最近在使用String类型作为函数入参的时候, 发现函数内对于String类型的改变并不会影响到外层调用对象本身; 结论 (先说结论) ...

  10. Unique -「企划」新生守则(?

    随想随记,主要是整活. 红色贝雷帽大爷会在校园不定期游走,遇见记得打招呼. 面食堂冰沙类饮品请快速解决或者边喝边搅,如果发现饮品甜度骤减请快速前往最近的垃圾桶扔掉. 关于散养猫小黄和小黑. 如果看见小 ...