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. C#.NET读取文本文件的几种办法

    一次读取一个字符 //文件路径 string filePath = @"C:\Users\Administrator\Downloads\test\test.txt"; //文本读 ...

  2. .NET混合开发解决方案24 WebView2对比CefSharp的超强优势

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  3. 全网求解,用Python处理一个基础题目

    昨天在群里看见一个Python的问题,趁着今天有那么一点点时间,就想把这个题目分享出来,让大家一起解决.毕竟三个臭皮匠,赛过诸葛亮.原始数据如下: 1 origin_lst = [0, 0, 1, 2 ...

  4. NC202498 货物种类

    NC202498 货物种类 题目 题目描述 某电商平台有 \(n\) 个仓库,编号从 \(1\) 到 \(n\) . 当购进某种货物的时候,商家会把货物分散的放在编号相邻的几个仓库中. 我们暂时不考虑 ...

  5. docker下node环境搭建

    初始化⼀个NodeJs程序 以下操作必须已经安装了NodeJS. ⾸先创建⼀个空⽂件夹.并创建以下⽂件: server.js package.json Dockerfile .dockerignore ...

  6. @RequestBody,@RequestParam是否能随意改变入参字母大小写

    在工作中遇到了一个问题,很多接口有的入参是companyName,有的入参是companyname,实际上,这两入参能任意适配所有接口,甚至随意改变大小写! 1. @RequestBody是完全按照驼 ...

  7. day11 Java反射机制

    java反射机制 反射是java中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,属性的调用等,而不是传统意义上的在编码期间确定. 因此,反射可以大大的提高代码的灵活度,但是随之而来 ...

  8. 利用Kaptcha.jar生成图片验证码(以下源码可以直接复制并自定义修改)

    说明:Kaptcha是一个很实用的验证码生成工具,它可以生成各种样式的验证码,因为它是可以配置的 目录: 一 实现步骤 二 实例 A 编写jsp页面 B 配置web.xml C 验证输入正确与否. 一 ...

  9. 类型转换_str()函数与int()函数

    数据类型转换 需要将不同数据类型拼接在一起的时候就需要先进行数据类型转换 str+str//这里的+叫做连接字符,有点类似C++中的操作符重载,老对象里面的内容了 在python中整型和字符串类型不能 ...

  10. python 装饰器理解

    简介 装饰器可以在不修改原有代码的基础上添加新的功能,可以将重复重用的代码抽取出来,进一步解耦,方便维护,一般适用于插入日志.性能测试.事务处理.缓存等 装饰器的前提 闭包 一般来说,当一个函数嵌套另 ...