首页 > 编程语言 >Java SE 17 新增特性

Java SE 17 新增特性

时间:2022-08-22 07:22:06浏览次数:82  
标签:JEP Java 17 API public SE

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

标签:JEP,Java,17,API,public,SE
From: https://www.cnblogs.com/greyzeng/p/16611619.html

相关文章

  • Noise Reduction paper
    1992-LeonidI.Rudin,StanleyOsher,andEmadFatemi.1992.Nonlineartotalvariationbasednoiseremovalalgorithms.Phys.D60,1–4(Nov.1,1992),259–2......
  • JavaIO流
    JavaIO流一、流的概念内存与存储设备之间传输数据的通道。例如在内存中的程序,想要读取硬盘中的文件,必须借助流;在水库中的水流入家庭中(存储设备到内存)二、流的分类按方......
  • 1033 [NOIP2017]逛公园 记忆化搜索 比最短路长k的方案数 dp递推算方案数
     链接:https://ac.nowcoder.com/acm/contest/26077/1033来源:牛客网题目描述策策同学特别喜欢逛公园。公园可以看成一张N个点M条边构成的有......
  • mybaits-plus+druid 使用 LocalDateTime 出现nested exception is java.sql.SQLFeatur
    解决方案一(推荐)目前druid已经修复了这个问题并提交了新版本,最优直接选择升级druid至1.1.21或以上releases版本地址 https://github.com/alibaba/druid/releases/tag/......
  • LeetCode 1472. Design Browser History
    原题链接在这里:https://leetcode.com/problems/design-browser-history/题目:Youhavea browser ofonetabwhereyoustartonthe homepage andyoucanvisitan......
  • UML建模——用例图(Use Case Diagram)
    UML建模——用例图(UseCaseDiagram)用例图主要用来描述角色以及角色与用例之间的连接关系。说明的是谁要使用系统,以及他们使用该系统可以做些什么。一个用例图包含了多个......
  • Communications link failure The last packet sent successfully to the server was
    CommunicationslinkfailureThelastpacketsentsuccessfullytotheserverwas0millisecondsago.Thedriverhasnotreceive...mysql数据库是5.7版本数据库的......
  • JS compose 函数实现
    functioncompose(...funcs){letlength=funcs.length;if(length===0){return(arg)=>arg;}if(length===1){return......
  • tortoise orm
    反向代码提示:在使用外键的时候,我们需要获取到反向代码提示(即被绑定的model查询绑定model),这个时候需要使用relation字段来提示,(其实你不加也没啥关系,只是个提示作用,在django......
  • JavaScript快速入门-04-运算符
    4运算符4.1算术运算符4.1.1概述  JavaScript提供的算术运算符如下所示:类型符号示例加法运算符+a+b减法运算符-a-b乘法运算符*a*b除......