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. mac M1 php扩展 xlswriter 编译安装爬坑记录

    电脑配置 MacBook Pro(14英寸,2021年) 系统版本 macOS Monterey 12.4 芯片 Apple M1 Pro PHP环境 MAMP Pro Version 6.6.1 ( ...

  2. php 二维数组转换一维数组

    $result = array_reduce($res, function ($result, $value) { return array_merge($result, array_values($ ...

  3. Torch的索引与形变

    >>> a = torch.Tensor([[1,2],[3,4]])>>> atensor([[1., 2.], [3., 4.]])>>> a ...

  4. Vscode个性化设置:让一个小萌妹陪你敲代码

    前言 大家平时都用什么代码编辑器啊!我个人比较喜欢用vscode,因为有以下几点: 开源,免费: 自定义配置 集成git 智能提示强大 支持各种文件格式(html/jade/css/less/sass ...

  5. 使用Java编写一个日期时间封装类

    package base; import java.util.GregorianCalendar; import java.util.StringTokenizer; import java.util ...

  6. React技巧之发出http请求

    原文链接:https://bobbyhadz.com/blog/react-send-request-on-click 作者:Borislav Hadzhiev 正文从这开始~ 总览 在React中, ...

  7. python小题目练习(七)

    题目:实现如下图所示结果 代码实现: """Author:mllContent:模拟火车订票系统Date:2020-11-16"""# 定义 ...

  8. NC200211 装备合成

    NC200211 装备合成 题目 题目描述 牛牛有 \({x}\) 件材料 \({a}\) 和 \({y}\) 件材料 \({b}\) ,用 \({2}\) 件材料 \({a}\) 和 \({3}\) ...

  9. Docker容器搭建android编译环境

    Docker容器搭建android编译环境 目录 1 部署容器 1.1 手动部署 1.1.1 配置docker 1.1.2 启动容器 1.1.3 配置环境 1.2 Dockerfile 2 镜像管理 ...

  10. throw关键字和Objects非空判断_requireNonNull方法

    作用: 可以使用throw关键字在指定的方法中抛出指定的异常 使用格式: throw new xxxException("异常产生的原因") 注意: 1.throw关键字必须写在方 ...