• Java SE 17 新增特性


    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 Grey
     * @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 Grey
     * @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 Grey
     * @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

  • 相关阅读:
    想要拿到手软的大厂offer必须要刷5遍这份5000页Java 最全技术栈手册
    java日常开发必备:list的四种遍历
    iPhone开发--Xcode15下载iOS 17.0.1 Simulator Runtime失败解决方案
    angle_ll
    怎么维护自己的电脑?
    毕设 JAVA JSP学生成绩管理系统sqlserver论文
    小白能理解的奈奎斯特采样及延伸出的理论
    什么是通配符SSL证书?它和多域名SSL证书的区别是什么?
    武汉新时标文化传媒有限公司内容策划需要遵守这几个原则!
    linux ubuntu中配置nfs共享存储服务
  • 原文地址:https://www.cnblogs.com/greyzeng/p/16611619.html